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 にトバさねぇと駄目なんだろな、と言いつつ限界。とりあえず記録のみ残しておきます。