SICP : Ex2.4

Concurrent Cleanでは表現できないと思って飛ばしていた問題なのだけれど、ここ最近の記事の内容と関連すると思ったので、Schemeで書いておくことにします。
問題は、cons, car, cdrを特別なデータ型を仮定せずに、手続きだけで作り出すことができるということを示すというものです。
まず、p.91にある例

(define (cons x y)
  (define (dispatch m)
    (cond ((= m 0) x)
          ((= m 1) y)
          (else (error "Argument not 0 or 1 -- CONS" m))))
  dispatch)

(define (car z) (z 0))

(define (cdr z) (z 1))

で、Ex2.4

(define (cons x y)
  (lambda (m) (m x y)))

(define (car z)
  (z (lambda (p q) p)))

(define (cdr z)
  (z (lambda (p q) q)))