[plt-scheme] Contracts: having ->r and opt->
Appears not:
(require (lib "contract.ss")
(lib "etc.ss"))
(define/contract foo
(->r ((x number?) (y (>/c x))) z (cons/c number? null?) any)
(opt-lambda (x y [z 0])
(+ x y z)))
[bug] 3:3: foo broke the contract
(->r ((x ...) (y ...)) z ... ...)
on foo; expected a procedure that accepts 2 arguments and aribtrarily more (not arity (2 3)), got #<procedure:foo>
The only alternative I can see is to use case->, but the docs say ->r is not allowed as an alternative in case->:
The case-> expression constructs a contract for
case-lambda function. It's arguments must all be function
contracts, built by one of ->, ->d,
->*, or ->d*.
Except the docs lie:
(define/contract foo
(case->
(->r ((x number?) (y (>/c x))) any)
(->r ((x number?) (y (>/c x)) (z number?)) any))
(opt-lambda (x y [z 0])
(+ x y z)))
> (foo 1 2 3)
6
> (foo 1 2)
3
> (foo 2 1)
[bug] 7:3: 7:2 broke the contract
(case->
(->r ((x ...) (y ...)) ...)
(->r ((x ...) (y ...) (z ...)) ...))
on foo; expected <(>/c 2)>, given: 1
>
I guess this is an oversight in the documentation of the contract language
N.
----- Original Message ----
From: Paulo J. Matos <pocm at soton.ac.uk>
To: PLT-list Mailing <plt-scheme at list.cs.brown.edu>
Sent: Sunday, April 8, 2007 11:10:18 AM
Subject: [plt-scheme] Contracts: having ->r and opt->
Hello all,
Is it possible to have contracts for opt-lambda which arguments depend
on each other?
For example:
(define foo
(opt-lambda (x y [z 0])
....))
x, y and z should be numbers and y should be bigger than x. Is it
possible to say this in a contract?
Cheers,
--
Paulo Jorge Matos - pocm at soton.ac.uk
http://www.personal.soton.ac.uk/pocm
PhD Student @ ECS
University of Southampton, UK
_________________________________________________
For list-related administrative tasks:
http://list.cs.brown.edu/mailman/listinfo/plt-scheme
____________________________________________________________________________________
Be a PS3 game guru.
Get your game face on with the latest PS3 news and previews at Yahoo! Games.
http://videogames.yahoo.com/platform?platform=120121