SICP 読み (288) 5.4 積極制御評価器

問題 5.24 の解で

ev-cond-false
    (assign val (const false))
    (goto (reg continue))

みたいなコトしてるんですが、これじゃ駄目。でも現状では #f を戻すようにするにはどうすりゃ良いのか微妙。と言いつつ以下のようにしてみたらなんとかなっている模様。

ev-cond-false
    (assign val (const #f))
    (goto (reg continue))

うーん。微妙。

問題 5.25

昨日はお仕事が運転手対応で今日は一日だらだらしてたんですが頑張ってみる。とりあえず (283) なエントリが解と見てこれを盛り込んで (try 1 (/ 1 0)) が動けば良いのかな。
で、解を盛り込んで動作確認してみるとがんがんオチる。したコトを以下に。

  • 以下の手続きを定義 (4.2 節なソレからパクり)
    • thunk?
    • thunk-exp
    • thunk-env
    • delay-it
  • eceval-operations に追加
  • 他、細かいバグを修正

その後、EC-Eval に流し込んでみたらオチた。

;;; EC-Eval input:
(define (try a b) (if (= a 0) 1 b))

(total-pushes = 3 maximum-depth = 3)
;;; EC-Eval value:
ok

;;; EC-Eval input:
(try 0 (/ 1 0))
*** ERROR: wrong number of arguments for #<closure delay-it> (required 2, got 1)
Stack Trace:
_______________________________________
  0  (map (lambda (p) (p)) aprocs)
        At line 385 of "./ch5-regsim.scm"
  1  value-proc

  2  (set-contents! target (value-proc))
        At line 258 of "./ch5-regsim.scm"
  3  (instruction-execution-proc (car insts))
        At line 139 of "./ch5-regsim.scm"

むむ。delay-it に env を渡してないのか。修正してリトライ。

;;; EC-Eval input:
(define (try a b) (if (= a 0) 1 b))

(total-pushes = 3 maximum-depth = 3)
;;; EC-Eval value:
ok

;;; EC-Eval input:
(try 0 (/ 1 0))

(total-pushes = 27 maximum-depth = 10)
;;; EC-Eval value:
1

;;; EC-Eval input:

いえーい。これ、趣味なネタとして memoize な盛り込み、とゆーのがありますが次の問題 5.26 以降はさらに趣味の世界が広がっております。