« SICP 4.1.3 Evaluator Data Structure | Main | SICP 4.3の前に・・ »

2007.09.09

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以降はパス。

ソースはここ

|

« SICP 4.1.3 Evaluator Data Structure | Main | SICP 4.3の前に・・ »

Comments

Post a comment



(Not displayed with comment.)




TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/18154/16392793

Listed below are links to weblogs that reference SICP 4.2 Variations on Scheme --- Lazy Evaluation:

« SICP 4.1.3 Evaluator Data Structure | Main | SICP 4.3の前に・・ »