Use and/c
Currently it's just checking if your function is truish (it is) and then 
returns the second contract as the result of the expression.
-Ian
----- Original Message -----
From: "Matthew Butterick" <[email protected]>
To: "Racket mailing list" <[email protected]>
Sent: Monday, August 12, 2013 6:25:37 PM GMT -05:00 US/Canada Eastern
Subject: [racket] why would the order of contract predicates make a difference?




This contract intends to check if the rest argument is a) a list of symbols and 
b) has an even number of elements. 



The only difference (apparent to me) between proc1 and proc2 is the ordering of 
the contract predicates. Yet they give different results — proc1 seems to 
ignore the even? condition. Why would this be so? 




#lang racket/base 
(require racket/contract) 


(define/contract (proc1 . items) 
(() #:rest (and (λ(items) (even? (length items))) (listof symbol?)) . ->* . 
symbol?) 
'proc1-finished) 


(proc1 'foo 'bar) ; gives 'proc1-finished 
(proc1 'foo) ; gives 'proc1-finished, but why? I would expect contract 
violation 




(define/contract (proc2 . items) 
(() #:rest (and (listof symbol?) (λ(items) (even? (length items)))) . ->* . 
symbol?) 
'proc2-finished) 


(proc2 'foo 'bar) ; gives 'proc2-finished 
(proc2 'foo) ; gives contract violation 






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

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

Reply via email to