SICP 4.2 Variations on Scheme --- Lazy Evaluation
SICP 4.2 Variations on Scheme --- Lazy Evaluation
結局、named-let以降の問題は飛ばしてしまった。必要なときに戻ろう。let周辺が動けば、4章最後までいけるはず。
lazyに評価される必要があるものは、thunksと呼ばれるobjectに入れる。thunkを評価する事はforcingと呼ばれる。
Exercise 4.27
呼び出される度にcountの値が1増える。
(define count 0)
(define (id x)
(set! count (+ count 1))
x)
gaucheだと(define w (id (id 10)))の時点で、idが2回評価されて、countが2になる。wを評価しても、countは2のまま。そして、俺様処理系だと、(define w (id (id 10)))の時点で0。wを評価すると無限ループでエラーになった。ちくしょう。
今気がついたこと。
EmacsでSICPのdriver-loopをgaucheを使って動かす。
;;; L-Eval input;
この状態で、俺様処理系で評価したい式をC-cC-eで、gaucheとかと同じように評価できる!もっと早く気がつけば良かった。ついでに、the-global-environmentの綴りがgrobalになっていた。死にたい。
普通にset!動いてない。set!なおしたら動くようになった。
遅延評価というか、この処理系だと評価を一回したらevaluated-thunkになっちゃうから何回呼ばれても1回しか評価されない。だから、wを評価した時点でcountが1になる。
exercise 4.29
とりあえず、この3行をコメントアウトでmemoizationをしない
(define (force-it obj)
(cond ((thunk? obj)
(let ((result (actual-value
(thunk-exp obj)
(thunk-env obj))))
; (set-car! obj 'evaluated-thunk)
; (set-car! (cdr obj) result)
; (set-cdr! (cdr obj) '())
result))
((evaluated-thunk? obj)
(thunk-value obj))
(else obj)))
exercise 4.30以降はパス。
ソースはここ
The comments to this entry are closed.


Comments