[plt-scheme] Contracts: having ->r and opt->

From: Noel Welsh (noelwelsh at yahoo.com)
Date: Sun Apr 8 11:37:23 EDT 2007

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


Posted on the users mailing list.