開発環境
- OS X Lion - Apple(OS)
- Emacs、BBEdit - Bare Bones Software, Inc. (Text Editor)
- プログラミング言語: MIT/GNU Scheme
計算機プログラムの構造と解釈(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.6(内部定義)、問題 4.16を解いてみる。
その他参考書籍
問題 4.16
a.
コード(BBEdit)
sample.scm
(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))
(let ((val (car vals)))
(if (eq? val '*unassigned)
(error "Unassigned variable" var)
val)))
(else (scan(cdr vars) (cdr vals)))))
(if (eq? env the-empty-environment)
(error "Unbound variable" var)
(let ((frame (first-frame env)))
(scan (frame-variables frame)
(frame-values frame)))))
(env-loop env))
b.
コード(BBEdit)
sample.scm
(define (scan-out-defines body)
(define (scan exp vars vals body)
(if (null? exp)
(append (list 'let
(map (lambda (x)
(list x ''*unassigned*))
vars))
(map (lambda (x y)
(list 'set! x y))
vars
vals)
body)
(let ((e (car exp)))
(if (definition? e)
(scan (cdr exp)
(cons (cadr e) vars)
(cons (cddr e) vals)
'())
(scan (cdr exp)
vars
vals
(append body (list e)))))))
(scan body '() '() '()))
c.
make-procedureが呼ばれるのはevalのみ、procedure-bodyはeval、apply、user-printでも呼ばれるので、make-procedureの場所に組み込む方が優れている。
コード(BBEdit)
sample.scm
(define (make-procedure parameters body env) (list 'procedure parameters (scan-out-defines body) env))
0 コメント:
コメントを投稿