[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
   (->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)
> (foo 1 2)
> (foo 2 1)
[bug] 7:3: 7:2 broke the contract 
    (->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


----- 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?


Paulo Jorge Matos - pocm at soton.ac.uk
PhD Student @ ECS
University of Southampton, UK
  For list-related administrative tasks:

Be a PS3 game guru.
Get your game face on with the latest PS3 news and previews at Yahoo! Games.

Posted on the users mailing list.