SICP Exercise 4.7

SICP Exercise 4.7

a)爲什麼let*表達式可以重寫爲一些嵌套的let表達式?

因爲嵌套的let表達式可以讓已經做了的約束都是可見的。例如:

(let* ((x 3)
       (y (+ x 2))
       (z (+ x y 5)))
  (* x z))
可以重寫爲:

(let ((x 3))
  (let ((y (+ x 2)))
    (let ((z (+ x y 5)))
      (* x z))))
b)下面我們參考該例子,寫出把let*表達式轉化爲let表達式的實現:

(define (let*->nested-lets exp)
  (define (expand-clauses bindings body)
    (if (null? bindings)
        body
        (make-let (list (car bindings))
                  (expand-clauses (cdr bindings) body))))
  (expand-clauses (cadr exp) (caddr exp)))

(define (eval-let* exp env)
  (eval (let*->nested-lets exp) env))
c)可以向eval中添加
(eval (let*->nested-lets exp) env)
但是我更喜歡以數據導向的方式,所以只需再增加一條語句:

(put 'let* eval-let*)


測試結果:

;;; M-Eval input:
(let* ((x 3)
      (y (+ x 1)))
  (+ x y))

;;; M-Eval value:
7





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章