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.

Reply via email to