[racket] why would the order of contract predicates make a difference?

From: J. Ian Johnson (ianj at ccs.neu.edu)
Date: Mon Aug 12 18:29:22 EDT 2013

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" <mb.list.acct at gmail.com>
To: "Racket mailing list" <users at racket-lang.org>
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


Posted on the users mailing list.