問題5.30 a – SICP(計算機プログラムの構造と解釈)その280
2009年11月19日
問題5.30 a.
これまで、未束縛の変数があった場合は基盤の scheme のエラーを発生させていたために、評価器の駆動ループが終了されて基盤の scheme に戻ってしまっていた。
これを、未束縛の変数の存在を捕捉し評価器の駆動ループ内で処理させるように変更する。
;;; EC-Eval input: (+ x 2) *** ERROR: Unbound variable x Stack Trace: _______________________________________ 0 value-proc 1 (set-contents! target (value-proc)) At line 672 of "hoge.scm" 2 (instruction-execution-proc (car insts)) At line 552 of "hoge.scm" gosh>
変数を束縛があるかどうかを示すラベル (bound
, unbound
) と値のペアとし、束縛がある場合はその値を取り出し、束縛がない場合は評価器のエラー処理 (unbound
) にまわす。
未束縛の変数を入力して評価器の駆動ループから抜けることができなくなるので exit
を primitive-procedures
に追加しておく。
(define (lookup-variable-value var env) (define (env-loop env) (define (scan vars vals) (cond ((null? vars) (env-loop (enclosing-environment env))) ((eq? var (car vars)) (cons 'bound (car vals))) ; 束縛がある場合 (else (scan (cdr vars) (cdr vals))))) (if (eq? env the-empty-environment) (cons 'unbound '()) ; 束縛がない場合 (let ((frame (first-frame env))) (scan (frame-variables frame) (frame-values frame))))) (env-loop env)) (define (bounded? v-pair) (and (pair? v-pair) (eq? (car v-pair) 'bound))) (define (bounded-value v-pair) (cdr v-pair)) (define eceval-operations ;; 省略 (list 'bounded? bounded?) (list 'bounded-value bounded-value) (list 'exit exit) ;; 省略 )) (define eceval (make-machine '(exp env val proc argl continue unev) eceval-operations '( ;; 省略 ev-variable (assign val (op lookup-variable-value) (reg exp) (reg env)) (test (op bounded?) (reg val)) (branch (label ev-bounded-value) (reg val)) (goto (label unbounded)) ev-bounded-value (assign val (op bounded-value) (reg val)) (goto (reg continue)) unbounded (assign val (const unbounded-variable-error)) (goto (label signal-error)) ;; 省略 )))
未束縛のエラーを捕捉し駆動ループに戻るようになった。
;;; EC-Eval input: (+ x 2) unbounded-variable-error ;;; EC-Eval input:
問題5.30 b.
パス
計算機プログラムの構造と解釈
posted with amazlet at 08.11.07
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
ピアソンエデュケーション
売り上げランキング: 6542