练习2.04
(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)))
练习2.05
(define (cons23 n)
(let* ((a (get-a n))
(b (if (> a 0) (get-b (/ n a)) (get-b n))))
(cons a b)))
(define (get-a n)
(define (a-iter n a)
(if (= 0 (remainder n 2))
(a-iter (/ n 2) (+ a 1))
a))
(a-iter n 0))
(define (get-b n)
(define (b-iter n b)
(if (< (/ n 3) 1)
b
(b-iter (/ n 3) (+ b 1))))
(b-iter n 0))
练习2.06
(define zero (lambda (f) (lambda (x) x))) ;turn f into procedure (lambda (x) x)
(define (add-1 n)
(lambda (f) (lambda (x) (f ((n f) x))))) ;'add' f to n
;(add-1 zero)
;(define one (add-1 zero))
;(define one (lambda (f) (lambda (x) (f (((lambda (f) (lambda (x) x)) f) x)))))
;(define one (lambda (f) (lambda (x) (f ((lambda (x) x) x)))))
(define one (lambda (f) (lambda (x) (f x))))
;(add-1 one)
;(define two (add-1 one))
;(define two (lambda (f) (lambda (x) (f ((one f) x)))))
;(define two (lambda (f) (lambda (x) (f ((lambda (x) (f x)) x)))))
(define two (lambda (f) (lambda (x) (f (f x)))))
(define + (lambda (x y) (lambda (f) (lambda (x) ((x f) ((y f) x))))))
;test
(newline)
(define (inc x) (+ x 1))
(display ((zero inc) 0))
(newline)
(display ((one inc) 0))
(newline)
(display ((two inc) 0))
(newline)
(display (((+ one two) inc) 0))