問題5.30 a – SICP(計算機プログラムの構造と解釈)その280

問題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) にまわす。
未束縛の変数を入力して評価器の駆動ループから抜けることができなくなるので exitprimitive-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.

パス

計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
«
»