[racket] style guide, was Re: Contracts and submodules
P.S. I have re-written chapter 3 of the style guide in particular 3.3 and 3.6 to add your idea:
http://www.ccs.neu.edu/home/matthias/Style/style/Units_of_Code.html
On Mar 5, 2013, at 9:59 AM, Matthias Felleisen wrote:
>
> 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
>> <matthias at 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" <matthias at ccs.neu.edu
>>>>> <mailto:matthias at 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