这是一种有趣的表示数据的方式:作为函数。请注意,这
的定义cons
返回一个lambda
which 结束参数x
and y
,捕捉他们内心的价值观。另请注意,返回的 lambda
收到一个function m
作为参数:
;creates a closure that "remembers' 2 values
(define (cons x y) (lambda (m) (m x y)))
;recieves a cons holding 2 values, returning the 0th value
(define (car z) (z (lambda (p q) p)))
;recieves a cons holding 2 values, returning the 1st value
(define (cdr z) (z (lambda (p q) q)))
在上面的代码中z
是一个闭包,与创建的相同cons
,并在
我们正在传递的过程的主体another lambda
作为参数,
记住m
?就是这样!它所期望的功能。
理解了上面的内容,就很容易明白如何car
and cdr
工作;让我们
剖析如何car
, cdr
由解释器一次一步地进行评估:
; lets say we started with a closure `cons`, passed in to `car`
(car (cons 1 2))
; the definition of `cons` is substituted in to `(cons 1 2)` resulting in:
(car (lambda (m) (m 1 2)))
; substitute `car` with its definition
((lambda (m) (m 1 2)) (lambda (p q) p))
; replace `m` with the passed parameter
((lambda (p q) p) 1 2)
; bind 1 to `p` and 2 to `q`, return p
1
总结一下:cons
创建一个“记住”两个值的闭包,car
接收该闭包并将其传递给一个充当选择器的函数
第零个值,以及cdr
充当第一个值的选择器。钥匙
这里要理解的一点是lambda
充当closure。
这有多酷?我们只需要存储和检索任意数据的函数!
的嵌套组合car
& cdr
are 定义最多 4 层深度在大多数 LISP 中。例子:
(define caddr (lambda (x) (car (cdr (cdr x)))))