SICP 習題 2.4 是一道很有意思的題目,它在一定程度上會改變你對數據結構的認識。
按題目的說法,這裏講到的是“序對的過程性表示”。
序對大家應該熟悉了,前面幾道題都和序對有關係,那序對的“過程性表示”是什麼意思呢?
簡單一點說就是用一種過程(或者說函數啦)來實現序對。
在此之前,對於很多程序員來講,數據是數據,過程是過程,兩者是單獨存在的,過程一般是用來訪問數據的。像這裏講到的使用一個過程來實現數據結構真是一件奇怪的事情。
先看看題目給出的樣例吧,題目說到,如果我們有下面這些個過程定義,那麼,對於任意的x 和y , (car(cons x y))都將產生x:
(define (cons x y)
(lambda (m) (m x y)))
(define (car z)
(z (lambda (p q) p)))
上面的代碼閱讀起來還是有些困難的,因爲涉及到兩個lambda過程
就像題目說到的,爲了更好地理解這裏的過程,建議使用代換的方式,我們來看看代換的過程:
(car(cons x y))
=> (car (lambda (m) (m x y)))
=> ((lambda (m) (m x y)) (lambda (p q) p))
=> ((lambda (p q) p) x y)
=>((lambda (x y) x))
=> x
我第一次做完這個代換過程後都覺得不可思議,感覺就像是眼睜睜看着撲克牌從劉謙手裏消失一樣。
這裏cons返回的是一個lambda函數,這個lambda函數接受一個參數,將這個參數作用於x y。
而car 接受一個參數,將這個參數作用於另一個lambda函數,這個lambda函數接受兩個參數,永遠返回第一個參數。
將cons和car連接起來使用就是“作用於x y,永遠返回第一個參數x”。
這個想明白了以後完成題目就比較簡單了,題目要求我們按這個思路去定義對應cdr過程,我定義的cdr代碼如下:
(define (cdr z)
(z (lambda (p q) q)))
意思就是cdr接受一個參數,將這個參數作用於一個lambda過程,該lambda過程接受兩個參數,永遠返回第二個參數。
這樣題目就完成了,不過關於這道題給我們帶來的啓發還是值得我們仔細琢磨。
完成題目容易,理解題目的用意不易。。。。。。