這是一種表達數據的有趣方式:作爲函數。注意cons
的這個 的定義返回lambda
,其中關閉參數x
和y
,在其中捕獲它們的值。還要注意的是,返回的拉姆達 接收功能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
創建的相同,並且在 的過程的主體,我們'再傳遞另一個lambda
作爲參數, 記得m
?就是這樣!它期望的功能。
瞭解以上情況,很容易看出car
和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。 散熱效果如何呢?我們只需要的功能是存儲並檢索任意數據!
在大多數LISP中嵌套組合物car
& cdr
是defined up to 4 deep。例如:
(define caddr (lambda (x) (car (cdr (cdr x)))))
您可能會感興趣[如何設置!在方案中定義?](http://stackoverflow.com/q/16733472/1281433)其中接受的答案顯示如何實現存儲一個值的單元格。這是同樣的想法。另請參閱[Lambda微積分CONS對與Lisp一起實現](http://stackoverflow.com/q/13537622/1281433),其定義與您的一樣:'pair≡λx.λy.λz.zx y'。 –