<div dir="ltr"><div>This contract intends to check if the rest argument is a) a list of symbols and b) has an even number of elements.<br></div><div><br></div><div>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?</div>
<div><br></div><div><br></div><div>#lang racket/base</div><div>(require racket/contract)</div><div><br></div><div>(define/contract (proc1 . items)</div><div> (() #:rest (and (ë(items) (even? (length items))) (listof symbol?)) . ->* . symbol?)</div>
<div> 'proc1-finished)</div><div><br></div><div>(proc1 'foo 'bar) ; gives 'proc1-finished</div><div>(proc1 'foo) ; gives 'proc1-finished, but why? I would expect contract violation</div><div><br></div>
<div><br></div><div>(define/contract (proc2 . items)</div><div> (() #:rest (and (listof symbol?) (ë(items) (even? (length items)))) . ->* . symbol?)</div><div> 'proc2-finished)</div><div><br></div><div>(proc2 'foo 'bar) ; gives 'proc2-finished</div>
<div>(proc2 'foo) ; gives contract violation</div><div><br></div><div><br></div><div><br></div></div>