Thank you for this information. I had been trying to figure out how to test 
contracts from within a module+ only to give up and move my test cases to a 
different file.

I think this reinforces that I should be asking more questions on the mailing 
list.

Alexander McLin



> On Aug 26, 2014, at 5:53 PM, Matthias Felleisen <[email protected]> wrote:
> 
> 
>> On Aug 26, 2014, at 5:43 PM, Kevin Forchione <[email protected]> wrote:
>> 
>> 
>>> On Aug 24, 2014, at 2:09 PM, Matthias Felleisen <[email protected]> 
>>> wrote:
>>> 
>>> Before you make fondue, ask. As you can see, people answer and answer 
>>> quickly. Indeed, Robby added an example to the Guide as he responded and 
>>> pushed it out into the repo. The next release will have an example due to 
>>> your posts. Thanks! 
>>> 
>>> Having said that, Racket is created by people who focus on systematic 
>>> design of software. The contract system is an example of this; 
>>> 
>>> -- it serves the purpose of creating software systematically (continuing 
>>> the so-called Design by Contract line of work) 
>>> -- it itself is developed systematically with inquires into the semantics 
>>> of contracts because we took contracts way beyond the primitive notion from 
>>> the 1980s and 1990s. 
>>> 
>>> But, the existence of ->i and ->d should give you a hint that we 
>>> occasionally make mistakes and we try to correct them without modifying 
>>> existing code. ->d is mostly okay, but ->i is better. When Robby created 
>>> ->i, he also used his experience with ->d to force programmers to list 
>>> dependency variables explicitly. That's why you have to say "(lst)", for 
>>> example. In addition, the language grows and with it, we have to grow the 
>>> contract system. Keyword arguments is an example of that kind. 
>>> 
>>> As for the philosophy behind our contract system, I think the guide's 
>>> opening section on boundaries brings across the idea that separates our 
>>> contracts from old-style stuff. It may not become immediately clear, but 
>>> when you program with contracts for a while, you will appreciate it.
>> 
>> Wow! I am increasingly appreciating this approach (along with Racket’s 
>> systematic approach to design). 
>> 
>> I’m slowly converting my modules over to use contract-out and the ->i form 
>> makes it easy to see at a glance what the domains and ranges are, and I’m 
>> thinking the notation might be useful in the function definition’s comments 
>> as well. Is there a way to integrate unit testing into this approach? The 
>> (module+ test …) unit testing I’ve been doing is within the boundary of the 
>> mode and I wonder if there isn’t a way to simply move those test cases into 
>> another module (within the same file) and require it into the (module+ test 
>> …) form?
> 
> 
> Yes, you can use submodules to import the outer module thru the contract 
> boundary and then run unit tests in the submodule: 
> 
> 
> #lang racket
> 
> (provide 
> (contract-out
>  (f (-> integer? integer?))))
> 
> ;; ---------------------------------
> ;; implementation 
> 
> (module+ test (require rackunit))
> 
> (define (f x)
>  x)
> 
> (module+ test 
>  (require (submod ".."))
>  (check-equal? (f 1) 1)
>  (check-equal? (f 'a) 'a))
> 
> 
> We should probably document this little trick somewhere. -- Matthias
> 
> 
> ____________________
>  Racket Users list:
>  http://lists.racket-lang.org/users

____________________
  Racket Users list:
  http://lists.racket-lang.org/users

Reply via email to