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

From: Matthew Butterick (mb.list.acct at gmail.com)
Date: Mon Aug 12 18:25:37 EDT 2013

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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20130812/7625e1fd/attachment.html>

Posted on the users mailing list.