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

横着して allcode なソレを使用。ch5-syntax.scm に

(define true #t)
(define false #f)

を追加。あとは gosh 起動して

gosh> (add-load-path ".")
("." "/usr/share/gauche/site/lib" "/usr/share/gauche/0.8.8/lib")
gosh> (load "load-eceval")
#t
gosh> (define the-global-environment (setup-environment"))
the-global-environment
gosh> (start eceval)


;;; EC-Eval input:

で OK な模様。とりあえず今から中身を確認。
と言いつつ、問題の検証をしてみる事に。で、問題 5.23 なエントリを見てると

ev-cond
  (assign exp (op eval->if) (reg exp))
  (goto (label eval-dispatch))

なコト書いてるぞ。eval->if って何だ。allcode なソレには cond->if がある。よっしゃー、とか言いつつ手続きを盛り込んで評価器を起動しようとしたら unknown operation と叱られる。これは make-machine に渡す primitive な手続きリストに盛り込まれていないな、と。
で、試験。

$ gosh
gosh> (add-load-path ".")
("." "/usr/share/gauche/site/lib" "/usr/share/gauche/0.8.8/lib")
gosh> (load "load-eceval")
*** ERROR: unbound variable: cond-if
Stack Trace:
_______________________________________
gosh> (load "load-eceval")
#t
gosh> (define the-global-environment (setup-environment))
the-global-environment
gosh> (start eceval)


;;; 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:
(append '(a b c) '(d e f))
*** ERROR: Unbound variable cond

どはー。
eval-dispatch に盛り込んでねぇ。ええと、ch5-syntax.scm には cond 関連な手続きもあるので、評価器本体には cond? があれば良いのかな。で append を評価させてみたら一応動きました。

;;; EC-Eval input:
(append '(a b c) '(d e f))

(total-pushes = 118 maximum-depth = 17)
;;; EC-Eval value:
(a b c d e f)

;;; EC-Eval input:

一応、出てる数値や出力は if なケイスと同じにはなっています。

$ gosh
gosh> (add-load-path ".")
("." "/usr/share/gauche/site/lib" "/usr/share/gauche/0.8.7/lib")
gosh> (load "load-eceval")
#t
gosh> (define the-global-environment (setup-environment))
the-global-environment
gosh> (start eceval)


;;; EC-Eval input:
(define (append x y)
(if (null? x)
y
(cons (car x)
(append (cdr x) y))))

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

;;; EC-Eval input:
(append '(a b c) '(d e f))

(total-pushes = 118 maximum-depth = 17)
;;; EC-Eval value:
(a b c d e f)

;;; EC-Eval input:

エントリに載ってる解はダウトとゆー事で。(とほほ
次の問題は同じ方法で試験できるんですが、現実トウヒのネタにさせて下さひ。(を
# 明日朝早いッス。