You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
23 lines
749 B
23 lines
749 B
2 years ago
|
|
||
|
Exercise 4.7: 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?
|