I think "define/contract" protects a function from other incorrect calls 
from the same module.  So your "define/provide/contract" is not really 
"define/contract" + "provide".  Here is an example illustrating the 
problem, where the call to "bar" correctly reports the contract violation, 
but the call to "foo" does not:

#lang racket
(define-syntax (define/provide/contract stx)
  (syntax-case stx ()
    ((_ (name args ...)
        contract
        body ...)
     #'(begin
         (provide (contract-out (name contract)))
         (define (name args ...)
           body ...)))))

(define/provide/contract (foo a)
  (-> integer? any/c)
  (printf "a = ~a~%" a))

(define/contract (bar a)
  (-> integer? any/c)
  (printf "a = ~a~%" a))

(foo "Hello")
(bar "Hello")

On Thursday, April 8, 2021 at 4:47:39 AM UTC+8 [email protected] 
wrote:

> It is worth noting that it is relatively easy to implement a
> define/provide/contract syntax without any problems. In my two most
> active projects I use it extensively. In one case even with
> scribble/srcdoc to keep the contracts, scribblings and implementation in
> one place.
>
> The simplest version:
>
> (define-syntax (define/provide/contract stx)
> (syntax-case stx ()
> ((_ (name args ...)
> contract
> body ...)
> #'(begin
> (provide (contract-out (name contract)))
> (define (name args ...)
> body ...)))))
>
> Of course, this is not the best approach for all situations (and I do
> not use it everywhere), but it covers many common use-cases well.
>
>
> Dominik
>
> On 07. 04. 21 22:34, Robby Findler 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] <mailto:[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]
> > <mailto:racket-users%[email protected]>.
> > To view this discussion on the web visit
> > 
> https://groups.google.com/d/msgid/racket-users/149cfc632cd666ff1a92177dce90296b%40disroot.org
> > <
> 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]
> > <mailto:[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
> > <
> https://groups.google.com/d/msgid/racket-users/CAL3TdONLMx%3Dy_cgfDsY_k9L9yaX_touO52phiK9scziW_jGrOA%40mail.gmail.com?utm_medium=email&utm_source=footer
> >.
>

-- 
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/9e423bd1-3a26-4c13-a722-66b228a3eeb1n%40googlegroups.com.

Reply via email to