SICPゼミ第54回

練習問題4.28

演算子がevalの中で評価されない(遅延されてしまう)場合,すなわち複合手続きが引数として呼ばれた場合,演算子を評価しないままthunkがそのまま返ってきてしまう事がある.

例えば

(define (g x) (+ x 1))
(define (f g x) (g x))

とした場合に,(g 2) を呼ぶとするとこれは eval に渡るのは基本手続きのみであり,complex-application? 節が呼ばれない.そのため普通に eval が基本手続きとして値評価を行い,問題なく動く. 一方,(f g 2) を呼ぶとする.このとき actual-value でないとすると,引数である g が thunk のまま eval に渡されてしまい,エラーとなる.

練習問題4.29

メモ化してないと,引数が評価が必要な値のとき何回も評価が必要でつらい.引数をn回足すとかつらいし,フィボナッチとかやると破滅する.