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

問題4.7

[SICP] 問題4.7 – papamitraの日記 – 個人用SICP勉強グループ を参考にした。

(define (eval exp env)
  (cond ((self-evaluating? exp) exp)
        ; 省略
        ((let*? exp) (eval (let*->nested-lets exp) env))
        ; 省略
        (else
          (error "Unknown expression type -- EVAL" exp))))

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

(define (let*-clauses exp) (cdr exp))

(define (let*-bindings clauses) (car clauses))

(define (let*-body clauses) (cadr clauses))

(define (make-let* defs body)
  (list 'let defs body))

(define (let*->nested-lets exp)
  (if (null? exp)
      'false
      (let ((clauses (let*-clauses exp)))
           (let ((bindings (let*-bindings clauses))
                 (body (let*-body clauses)))
                (define (iter rest-bindings)
                  (if (null? rest-bindings)
                      body
                      (make-let* (list (car rest-bindings))
                                (iter (cdr rest-bindings)))))
           (iter bindings)))))

実行結果

;;; M-Eval input:
(let* ((x 3)
(y (+ x 2))
(z (+ x y 5)))
(* x z))

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