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

問題4.6

(define (eval exp env)
  (cond ((self-evaluating? exp) exp)
        ; 省略
        ((let? exp) (eval (let->combination 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) (cdr clauses))

(define (let->combination exp)
  (expand-let-clauses (let-clauses exp)))

(define (expand-let-clauses clauses)
  (if (null? (let-bindings clauses))
      '()
      (cons (make-lambda (map car (let-bindings clauses)) (let-body clauses))
            (map cadr (let-bindings clauses)))))

実行結果

;;; M-Eval input:
(define (foo x)
(let ((a 2) (b 5))
(+ (* x a) b)))

;;; M-Eval value:
ok

;;; M-Eval input:
(foo 3)

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