Особая форма 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* в набор непроизводных выражений?


Комментарии отсутствуют.

Необходима авторизация

Вы должны авторизоваться для создания комментария.

Вход