SICP練習 150 練習4 6

2021-09-23 23:15:13 字數 974 閱讀 1147

這道題需要我們將let表示式轉換成相應的表示式。

(let (( ) … ( )) )

從上面的示例我們可以看到在let表達中,假設其為expr,用cdr可以得到(( ) … ( )),然後再用高階函式map搭配car來取出所有的var。

同樣的,如果要取出exp部分,先用cadr,再用高階函式map搭配cadr。

而body部分用caddr就可以直接求出了。

然後就可以開始寫let->combination,其傳入乙個引數expr。

((lambda ( … ) ) )

根據這段示例**呢,我們先呼叫書中第256頁的make-lambda來構造前面的一部,這個函式有兩個引數parameter和body。

這樣一來就全部都完成了,當然了,還需要將let?加入到eval中,在此之前也要定義let?。同樣要呼叫第256頁的tagged-list?。那麼接下來就是具體的**咯。

(define

(let-vars expr)

(map

car (cadr expr)))

(define

(let-exp expr)

(map

cadr (cadr expr)))

(define

(let-body expr)

(caddr expr))

(define

(let->combination expr)

(cons

(make-lambda

(let-vars expr)

(let-body expr))

(let-exp expr)))

(define

(let? expr)

(tagged-list? expr 'let))

((let? expr)

(eval

(let->combination expr) env))

SICP練習 150 練習4 6

這道題須要我們將let表示式轉換成對應的表示式。let 從上面的演示樣例我們能夠看到在let表達中。如果其為expr。用cdr能夠得到 然後再用高階函式map搭配car來取出所有的var。相同的,如果要取出exp部分,先用cadr,再用高階函式map搭配cadr。而body部分用caddr就能夠直接...

SICP練習 46 練習2 5

練習2.5 這道題的意思是有乙個新的cons,其接受兩個引數a b,並且返回 2 a 3 b 這個比較容易實現了。define cons a b expt 2 a expt 3 b cons 2 2 value 36 根據題中的意思,並將其與car和cdr模擬,得知car是要分離出2 a,cdr是要...

SICP練習 46 練習2 5

練習2.5 這道題的意思是有乙個新的cons,其接受兩個引數a b,並且返回 2 a 3 b 這個比較容易實現了。define cons a b expt 2 a expt 3 b cons 2 2 value 36 根據題中的意思,並將其與car和cdr模擬,得知car是要分離出2 a,cdr是要...