SICP 読み (286) 5.4 積極制御評価器
今週は遊びに行かずまっずぐ帰りました。久々に現実トウヒ抜きなので今から頑張ります。
問題 5.24
評価器に盛り込み。(284) なエントリにてサラした手続きにバグ発見。ev-cond-loop のケツの goto に label の指定が抜けておりました。あとは eceval-operations に以下のリストを追加して
(list 'cond? cond?) (list 'cond-clauses cond-clauses) (list 'cond-else-clause? cond-else-clause?) (list 'cond-predicate cond-predicate) (list 'cond-actions cond-actions) (list 'null? null?) (list 'car car) (list 'cdr cdr)
まず以下の手続きで試験かな。
(define (append x y) (cond ((null? x) y) (else (cons (car x) (append (cdr x) y)))))
で、評価器に流し込んでみると
;;; EC-Eval input: (define (append x y) (cond ((null? x) y) (else (cons (car x) (append (cdr x) y))))) (total-pushes = 3 maximum-depth = 3) ;;; EC-Eval value: ok ;;; EC-Eval input:
おお、と言いそうになりましたが、問題はこの後か。
;;; EC-Eval input: (append '(1 2 3) '(4 5 6)) *** ERROR: Unbound variable cond 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"
とほほ。これは以前作ったデバッガを登場させないと駄目かも。一応この error を吐いているのは lookup-variable-value で、cond を変数と見ているのは確定。
しかし何故に cond を lookup してるんだ。ってかここまで分かってて何故原因不明か。とりあえずドリカムのソレが終わったんで作業再開。
続き
Stack Trace なソレによると make-operation-exp らしい。さらに見てみると make-assign が戻す手続きの
(lambda () ; execution procedure for assign (set-contents! target (value-proc)) (advance-pc pc)))))
の value-proc に割り当てられている make-operation-exp が戻す手続きな模様。
って何がなんだかワケ分からなくなりつつある。やっぱデバッガの出番か。あと、ev-sequence に jmp する時の手続きも微妙だったので修正。今これをヤるのはダウト気味ですが修正したので以下に控えを。
ev-cond-consequent (save continue) (assign unev (op cond-actions) (reg exp)) (goto (label ev-sequence))
あら?
(test (op cond?) (reg exp)) (branch (label ev-cond))
の配置場所を変えたらエラーメセジが変わった。
;;; EC-Eval input: (append '(1 2 3) '(4 5 6)) *** ERROR: pair required, but got x Stack Trace: _______________________________________ 0 clause 1 (map (lambda (p) (p)) aprocs) At line 385 of "./ch5-regsim.scm" 2 value-proc 3 (set-contents! target (value-proc)) At line 258 of "./ch5-regsim.scm" 4 (instruction-execution-proc (car insts)) At line 139 of "./ch5-regsim.scm"
本質的に変わってないんですが、なんか手掛りがありそげ。てか、よく見りゃ (op applicatin?) の後ろに入れちゃ駄目ぢゃん。てーか、エラーメセジによると_pair が欲しんだけど x_って変数を解決できてねぇんじゃね??
どっかで eval-dispatch にトバさねぇと駄目なんだろな、と言いつつ限界。とりあえず記録のみ残しておきます。