這道題須要我們將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是要...