1. Clutter removal is built into Racket: (define-syntax (interface stx) (syntax-case stx (subject-to) [(interface name clauses ...) ;; ==> .. (provide (contract-out ..) ..) ..]))
The above macro has become a standard in my recent projects where I place it into my ./Lib/contract.rkt library. It is part of an effort to develop a header-file style for Racket. And it is an effort to supply a way to selectively check contracts. [More soon. It is NOT about turning contracts off.] 2. Contract test issue acknowledged. I have run into this problem too during my recent construction of a game program. My work-around 3. Clutter removal is built into Racket: #lang racket #lang racket (define-syntax-rule (tmod def-or-exp ...) (module* test racket (require rackunit (submod "..")) (check-equal? 1 1) def-or-exp ...)) ;; ----------------------------------------- (provide (contract-out (f (-> integer? integer?)))) (define (f x) x) (tmod (check-equal? (f 2) 2) (check-equal? (f 3) 2)) Consider adding the above module to your ./Lib/contract.rkt library. On Mar 5, 2013, at 8:39 AM, Greg Hendershott wrote: > Not to flog this, but: > > Lately I've been trying to be a good little doobie and use `(provide > (contract-out))` instead of `define/contract`. Although it's more > typing/clutter, grumble grumble, I've been getting used to it. > > Unfortunately I discovered one gotcha: Using (module+ test <rackunit > tests>) means that the test bypasses the contract -- because it's a > submodule, and the contract is on the module boundary. So my unit > tests weren't exercising and validating the contract. I missed a buggy > contract this way. > > In hindsight this is all perfectly obvious. Just not from the guide. > To be fair using submodules for tests is a relatively recent practice > in Racket. But I wanted to point out the interaction in case it helps > anyone else who is trying to use module contracts and do unit tests > following the curent examples. > > One way to avoid this problem is instead of module+ use module*: > > (module* test racket ;; To test module-boundary contracts, must use > ;; module* and (require (submod "..")). > (require (submod "..")) > ... check check check ... > ) > > Of course this adds even more "clutter", but it works. > > On Thu, Dec 27, 2012 at 3:31 PM, Matthias Felleisen > <matth...@ccs.neu.edu> wrote: >> >> I have added a note on this issue to the Style issue; see section 3.6. >> Strictly speaking, this prose probably belongs into the Contract guide. -- >> Matthias >> >> >> >> On Nov 30, 2012, at 5:17 PM, Ryan Culpepper wrote: >> >>> You can have mutually recursive functions with define/contract, but you >>> can't with submodules. >>> >>> Ryan >>> >>> On 11/30/2012 05:04 PM, Ray Racine wrote: >>>> Why not make this explicit by deprecating define/contract and support >>>> this use case with a submodule. They lightweight enough and makes >>>> boundary demarcations consistent, explicit and simple. Module -> boundary. >>>> >>>> On Nov 30, 2012 12:05 PM, "Matthias Felleisen" <matth...@ccs.neu.edu >>>> <mailto:matth...@ccs.neu.edu>> wrote: >>>> >>>> >>>> On Nov 30, 2012, at 10:15 AM, Greg Hendershott wrote: >>>> >>>>>> This is a complete misunderstanding. >>>>> >>>>> Sometimes I feel like a kid in the room while the adults are talking. >>>>> When it comes to contracts, I have to stipulate that most of you are >>>>> smarter than me and have thought about this longer than me. >>>> >>>> >>>> Apologies. My opening wasn't meant to say "I am smarter" but I wanted >>>> to send a strong message about define/contract. It really introduces a >>>> boundary and in some strange sense your (possibly misleading) >>>> microbenchmark >>>> exposes this constraint too. >>>> >>>> >>>> >>>> ____________________ >>>> Racket Users list: >>>> http://lists.racket-lang.org/users >>>> >>>> >>>> >>>> ____________________ >>>> Racket Users list: >>>> http://lists.racket-lang.org/users >>>> >>> >>> ____________________ >>> Racket Users list: >>> http://lists.racket-lang.org/users >> >> >> ____________________ >> Racket Users list: >> http://lists.racket-lang.org/users ____________________ Racket Users list: http://lists.racket-lang.org/users