2013年9月5日木曜日

開発環境

計算機プログラムの構造と解釈(Gerald Jay Sussman(原著)、Julie Sussman(原著)、Harold Abelson(原著)、和田 英一(翻訳)、ピアソンエデュケーション、原書: Structure and Interpretation of Computer Programs (MIT Electrical Engineering and Computer Science)(SICP))の4(超言語的抽象)、4.1(超循環評価器)、4.1.3(評価器のデータ構造)、述語のテスト、手続きの表現、環境に対する操作、問題 4.13を解いてみる。

その他参考書籍

問題 4.13

コード(BBEdit)

sample.scm

;; evalにunbindを組み込む
(define (eval exp env)
  (cond ((…))
        ;; …
        ((unbind! exp) (eval-unbinding exp env))
        ;; …
        (else
         (error "Unkown expression type -- EVAL" exp))))

(define (unbind? exp) (tagged-list? exp 'unbined!))

(define (unbind-variable exp) (cadr exp))

(define (eval-unbinding exp env)
  (unbind! (unbind-variable exp)
           env)
  'ok)

;; 特殊形式unbind!の仕様
;; 環境の最初のフレームからだけ結合を除去する  
(define (unbind! var env)
  (let ((frame (first-frame env)))
    (define (scan vars vals)
      (cond ((null? vars)
             (error "Unbound variable" var))
            ((eq? var (car vars))
             (set-car! vars (cadr vars))
             (set-cdr! vars (cddr vars))
             (set-car! vals (cadr vals))
             (set-cdr! vals (cddr vals)))
            (else
             (scan (cdr vars) (cdr vals)))))
    (scan (frame-variables frame)
          (frame-values frame))))

;; テスト用
(define f-1 (make-frame '(a b) (list 1 2)))

(define f-2 (make-frame '(a c d e) (list 3 4 5 6)))

(define e (list f-1 f-2))

入出力結果(Terminal, REPL(Read, Eval, Print, Loop))

1 ]=> e

;Value 2: (((a b) 1 2) ((a c d e) 3 4 5 6))

1 ]=> (unbind! 'c e)

;Unbound variable c
;To continue, call RESTART with an option number:
; (RESTART 1) => Return to read-eval-print level 1.

2 error> ^C
Interrupt option (? for help): 
;Quit!

1 ]=> (unbind! 'a e)

;Unspecified return value

1 ]=> e

;Value 2: (((b) 2) ((a c d e) 3 4 5 6))

1 ]=> (unbind! 'a e)

;Unbound variable a
;To continue, call RESTART with an option number:
; (RESTART 1) => Return to read-eval-print level 1.

2 error> e

;Value 2: (((b) 2) ((a c d e) 3 4 5 6))

0 コメント:

コメントを投稿