問題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*) ;; これだけで十分なはず。