exercise 4.8. 「named let」 is a variant of let that has the form
(let
)
the and are just as in ordinary let, except that is bound within to a procedure whose body is and whose parameters are the variables in the . thus, one can repeatedly execute the by invoking the procedure named . for example, the iterative fibonacci procedure (section 1.2.2) can be rewritten using named let as follows:
(define
(fib n)
(let
fib-iter ((a
1)(b
0)(count
n))(if (=
count0)
b
(fib-iter
(+ a b) a (-
count1)))))
modify let->combination of exercise 4.6 to also support named let.
希望大家還是有事沒事看看原文啦,我才發現見過很多次的modify原來是修改的意思。
關於named let的一些比較什麼的,大家可以看這裡:【scheme歸納】3 比較do, let, loop。
從題目的**中我們也可以看到named-let的名字可以用cadr來取出,也就是書中的fib-iter。而body部分從以下**中也可以看出來得用3個cdr和1個car。
(let
)
而parameter題中已經說了是binding中變數,取出binding用caddr,而取出題目示例中的a、b和count等則用map和car即可。取出題目示例中的1、0和n則用map和cadr。
那麼接下來我們還需要將named-let轉換成函式,用list來構造這些就好,首先當然是』define,然後再用cons把name和parameter構造在一起,最後就是body啦。
當然了,在let->combination中我們需要判斷是不是named-let?,那麼怎麼判斷呢,先判斷是否是let?,再判斷expr的名字是不是符號(symbol?)。
最後就可以寫let-combination啦。首先用寫好的named-let?謂詞來進行判斷expr,然後為真的話就呼叫第257頁的sequence->exp函式,否則就用cons來繼續構造了。
(define
(named-let-name expr)
(cadr expr))
(define
(named-let-body expr)
(cadddr expr))
(define
(named-let-parameters expr)
(map
car (caddr expr)))
(define
(named-let-exp expr)
(map
cadr (caddr expr)))
(define
(named-let? expr)
(and
(let? expr)
(symbol?
(cadr expr))))
(define
(named-let->func expr)
(list
'define
(cons
(named-let-name epxr)
(named-let-parameters expr))
(named-let-body expr)))
(define
(let->combination expr)
(if (named-let? expr)
(sequence->exp
(list
(named-let->func expr)
(cons
(named-let-name expr)
(named-let-exp expr))))
(cons
(make-lambda
(let-vars expr)
(list
(let-body expr)))
(let-exp expr))))
SICP練習 152 練習4 8
exercise 4.8.named let is a variant of let that has the form let the and are just as in ordinary let,except that is bound within to a procedure whose ...
SICP練習 7 練習1 11
這種題目太像是數學題目了,不過拿到程式設計上又有一些的難度。我們先根據題目中的條件,寫出類似於第 25頁最下面的變換規則。我們先列出如下內容 a f n 1 f 2 f 3 f 4 f 5 b f n 2 f 1 f 2 f 3 f 4 c f n 3 f 0 f 1 f 2 f 3 於是繼而得出下...
SICP練習 12 練習1 18
練習1.8 和前兩題一樣,依舊是只能用對數步數。而且這個迭代過程要基於加 加倍和折半運算。這乙個習題要用到前面的函式,因此最好的做法是,每次都將寫好的 儲存起來。load test1.18.scm 這行 可以用來載入 而儲存可以用c x,c w。以下是該題的 這次我們寫成塊結構 define x y...