以下是题目给出的定义:
;;; 4-cons-and-car.scm
(define (cons x y)
(lambda (m)
(m x y)))
(define (car z)
(z (lambda (p q) p)))
表达式 (car (cons 1 2))
的展开序列如下:
(car (cons 1 2))
(car (lambda (m) (m 1 2))) ; 展开 cons
((lambda (z) (z (lambda (p q) p))) ; 展开 car ,代换 z
(lambda (m) (m 1 2)))
((lambda (m) (m 1 2)) ; 代换 m
(lambda (p q) p))
((lambda (p q) p) ; 代换 p
1 2)
1
根据 car
的定义,以及上面的展开序列给出的线索,我们可以写出对应的 cdr
函数:
;;; 4-cdr.scm
(define (cdr z)
(z (lambda (p q) q)))
表达式 (cdr (cons 1 2))
的展开序列如下:
(cdr (cons 1 2))
(cdr (lambda (m) (m 1 2))) ; 展开 cons
((lambda (z) (z (lambda (p q) q))) ; 展开 cdr ,代换 z
(lambda (m) (m 1 2)))
((lambda (m) (m 1 2)) ; 代换 m
(lambda (p q) q))
((lambda (p q) q) 1 2) ; 代换 q
2
测试:
1 ]=> (load "4-cons-and-car.scm")
;Loading "4-cons-and-car.scm"... done
;Value: car
1 ]=> (load "4-cdr.scm")
;Loading "4-cdr.scm"... done
;Value: cdr
1 ]=> (cdr (cons 1 2))
;Value: 2