Особая форма let*
Особая форма
let*
подобна
let
, но только связывания переменных в
let*
происходят последовательно, и каждое следующее связывание происходит в окружении, где видны все предыдущие. Например,
(let* ((x 3)
(y (+ x 2))
(z (+ x y 5)))
(* x z))
возвращает значение
39
. Объясните, каким образом можно переписать выражение
let*
в виде набора вложенных выражений
let
, и напишите процедуру
let*->nested-lets
, которая проделывает это преобразование. Если мы уже реализовали
let
(упражнение
4.6
) и хотим теперь расширить интерпретатор так, чтобы он обрабатывал
let*
, достаточно ли будет добавить в
eval
ветвь, в которой действием записано
(eval (let*->nested-lets exp) env)
или нужно явным образом преобразовывать
let*
в набор непроизводных выражений?
Комментарии отсутствуют.