問題4.7

(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))))


(define (let*->nested-lets exp)
  (let ((bindings (cadr exp)))
    (let binds->lets ((binds bindings))
      (if (null? (cdr binds))
          (append (list 'let (list (car binds))) (cddr exp))
          (list 'let (list (car binds))
                (binds->lets (cdr binds)))))))


(define (eval-let* exp env)
  (eval (let*->nested-lets exp) env))

(put 'eval 'let* eval-let*)

;; これだけで十分なはず。