No, I don't think it is a bad move if that's your goal! (I usually work at the file-level granularity but different code calls for different things.) I inferred from epi's message that that wasn't what was going on (perhaps incorrectly).
Robby On Wed, Apr 7, 2021 at 4:37 PM David Storrs <[email protected]> wrote: > I've always liked define/contract because it guarantees the safety of > the function from erroneous calls by other functions in the module, > which helps with debugging and testing. It sounds like you think > that's a bad move? > > On Wed, Apr 7, 2021 at 4:35 PM Robby Findler <[email protected]> > wrote: > > > > The short answer: you probably should use (provide (contract-out....)) > instead of define/contract. > > > > The slightly longer answer: when you write a contract, you are not just > describing what the legal inputs and outputs are, you are also establishing > a *boundary* between two regions of code. In the case of define/contract, > you are establishing a boundary between the function (here: f) and the > module that it contains (here the file "a.rkt"). In the case of (provide > (contract-out ...)) the boundary is between a.rkt and b.rkt. > > > > The slightly uncomfortable answer: it is my (not completely solid yet) > opinion that the boundary that is drawn for define/contract is perhaps not > the right / best one. In a theoretical/mathematical sense it is a > completely fine and completely defensible one. But it trips people up > sometimes. (There are examples others have posted in the past that are > perhaps even stranger than yours but boil down to the same specific design > choice for define/contract.) > > > > Robby > > > > > > > > On Wed, Apr 7, 2021 at 2:10 PM epi via Racket Users < > [email protected]> wrote: > >> > >> Hello Racket users, > >> > >> I am trying to understand a contract violation message that I am > getting. > >> Here is the file a.rkt: > >> > >> #lang racket > >> (provide f) > >> (define/contract (f a) > >> (-> boolean? any/c) > >> '()) > >> > >> and this is b.rkt: > >> > >> #lang racket > >> (require "a.rkt") > >> (f 3) > >> > >> > >> I would expect that the caller is blamed for the contract violation, > but the error message that I get is as follows: > >> > >> > >> f: contract violation > >> expected: boolean? > >> given: 3 > >> in: the 1st argument of > >> (-> boolean? any/c) > >> contract from: (function f) > >> blaming: /home/epi/snippets/a.rkt > >> (assuming the contract is correct) > >> at: /home/epi/snippets/a.rkt:3.18 > >> context...: > >> /usr/share/racket/collects/racket/contract/private/blame.rkt:347:0: > raise-blame-error > >> > /usr/share/racket/collects/racket/contract/private/arrow-higher-order.rkt:379:33 > >> body of "/home/dan/snippets/blameme.rkt" > >> > >> So, I am a bit surprised that the error message blames the file a.rkt. > >> What am I missing here? > >> > >> -- > >> You received this message because you are subscribed to the Google > Groups "Racket Users" group. > >> To unsubscribe from this group and stop receiving emails from it, send > an email to [email protected]. > >> To view this discussion on the web visit > https://groups.google.com/d/msgid/racket-users/149cfc632cd666ff1a92177dce90296b%40disroot.org > . > > > > -- > > You received this message because you are subscribed to the Google > Groups "Racket Users" group. > > To unsubscribe from this group and stop receiving emails from it, send > an email to [email protected]. > > To view this discussion on the web visit > https://groups.google.com/d/msgid/racket-users/CAL3TdONLMx%3Dy_cgfDsY_k9L9yaX_touO52phiK9scziW_jGrOA%40mail.gmail.com > . > > -- > You received this message because you are subscribed to the Google Groups > "Racket Users" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To view this discussion on the web visit > https://groups.google.com/d/msgid/racket-users/CAE8gKofSq%3DvzFV3jt3fkMbzMqV%3Dt9%2BHtj1y02Nsku_ZXF6%2BB5A%40mail.gmail.com > . > -- You received this message because you are subscribed to the Google Groups "Racket Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/racket-users/CAL3TdOO3P5eYn_GW8jmKO82haXvXNbKWJodeRh1%2BZ58y3SH%3DsQ%40mail.gmail.com.

