[plt-scheme] contract question

From: Jos Koot (jos.koot at telefonica.net)
Date: Wed Feb 6 09:22:54 EST 2008

Thanks, that is clear now.
Of course I already consulted the help desk. Thanks too for the pointer to 
the more elaborated doc.
Jos

----- Original Message ----- 
From: "Robby Findler" <robby at cs.uchicago.edu>
To: "Jos Koot" <jos.koot at telefonica.net>
Cc: "Dave Gurnell" <d.j.gurnell at gmail.com>; <plt-scheme at list.cs.brown.edu>
Sent: Wednesday, February 06, 2008 3:09 PM
Subject: Re: [plt-scheme] contract question


> We're still figuring out how or/c should work in the general
> higher-order case. For now, it only accepts a single non-flat
> contract. That is, you can write:
>
>  (or/c false/c (-> integer? integer?))
>
> using or/c.
>
> In v4, the arrow contract notation has been cleaned up, so looks a
> little bit different, and so the new documentation uses it instead,
> but you might find this useful:
>
>  http://pre.plt-scheme.org/docs/html/guide/contracts.html
>
> Robby
>
> On Feb 6, 2008 7:26 AM, Jos Koot <jos.koot at telefonica.net> wrote:
>>
>>
>> (case (-> ..) (-> ..)) works perfect. Why did I miss that? It is in the
>> docs, although at the very end of the chapter.
>>
>> I did already go along the line of your example with ->*, but it is less
>> restrictive than I want.
>>
>> Thanks,
>> Jos
>>
>>
>> ----- Original Message -----
>> From: Dave Gurnell
>> To: plt-scheme at list.cs.brown.edu
>> Sent: Wednesday, February 06, 2008 2:04 PM
>> Subject: Re: [plt-scheme] contract question
>>
>> I'm not sure why you can't use or/c (see below), but you should be able 
>> to
>> use ->* or case->:
>>
>>
>>
>>
>>     (define (example a (b #f))
>>       (if b (+ a b) (void)))
>>
>> ->* specifies contracts for variable arity procedures:
>>
>>
>>
>>     (provide/contract
>>      (example (->* (number?) (number?) (or/c number? void?))))
>>
>> case-> is intended for contracts on case-lambdas, but it should work okay
>> here:
>>
>>
>>
>>     (provide/contract
>>      (example (case-> (-> number? number? number?)
>>                       (-> number? void?))))
>>
>>
>> I thought or/c could only be used on value contracts but the 
>> documentation
>> suggests otherwise.
>>
>>
>>
>>
>>
>>
>>
>> Cheers,
>>
>>
>> -- Dave
>>
>>
>>
>>
>> Finally I decided to try contracts. I tried:
>>
>> #| require one or two numbers
>>    promise to return a number if two numbers are given
>>    promise void if one number is given |#
>>
>> #lang scheme
>>
>> (provide/contract
>>  (example
>>   (or/c
>>    (-> number? number? number?)
>>    (-> number? void?))))
>>
>> (define (example a (b #f))
>>  (if b (+ a b) (void)))
>>
>> This compiles, but it wont run:
>>
>> Welcome to DrScheme, version 3.99.0.10-svn4feb2008 [3m].
>> Language: Module custom.
>> or/c: two arguments, (-> number? void?) and (-> number? number? number?),
>> might both match #<procedure:example>
>>
>> Why? What is wrong in my contract? May be I am wanting an impossible
>> contract?
>> or/c repeats exactly what I want, but does not accept it.
>> I think I am missing something fundamental, but I can't find an answer in
>> the docs.
>> Thanks, Jos Koot_________________________________________________
>>  For list-related administrative tasks:
>>  http://list.cs.brown.edu/mailman/listinfo/plt-scheme
>>
>>
>>
>>  ________________________________
>>
>>
>>
>> _________________________________________________
>>   For list-related administrative tasks:
>>   http://list.cs.brown.edu/mailman/listinfo/plt-scheme
>>
>> _________________________________________________
>>   For list-related administrative tasks:
>>   http://list.cs.brown.edu/mailman/listinfo/plt-scheme
>>
>>
> 



Posted on the users mailing list.