2013年8月30日金曜日

開発環境

計算機プログラムの構造と解釈(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.2(式の表現)、問題 4.7を解いてみる。

その他参考書籍

問題 4.7

コード(BBEdit)

sample.scm

(define (let*? exp) (tagged-list? exp 'let*))

(define (let*-vars-and-exps exp) (cadr exp))

(define (let*-body exp) (cddr exp))

(define (let*->nested-lets exp)
  (expand-lets (let*-vars-and-exps exp)
               (let*-body exp)))

(define (expand-lets lets body)
  (if (null? lets)
      body
      (list 'let 
             (list (list (v (caar lets))
                         (e (caddr lets))))
             (expand-lets (cdr lets) body))))

;; 組み込み((eval (let*->nested-lets exp) env)である節を追加するだけで十分。
;; 導出されたのでない式を使ってlet*を積極的に展開する必要はない
(define (eval exp env)
  (cond ()
        ;; …
        ((let? exp) (eval (let->combination exp) env))
        ((let*? exp (eval (let*->nested-lets exp) env)))
        ;; …))

0 コメント:

コメントを投稿