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