Let*
let*
is similar to
let
, except that the bindings of the
let*
variables are performed sequentially from left to right, and each binding is made in an environment in which all of the preceding bindings are visible. For example
(let* ((x 3)
(y (+ x 2))
(z (+ x y 5)))
(* x z))
returns
39
. Explain how a
let*
expression can be rewritten as a set of nested
let
expressions, and write a procedure
let*->nested-lets
that performs this transformation. If we have already implemented
let
(exercise
4.6
) and we want to extend the evaluator to handle
let*
, is it sufficient to add a clause to
eval
whose action is
(eval (let*->nested-lets exp) env)
or must we explicitly expand
let*
in terms of non-derived expressions?