Лексический вычислитель и явные операции с кадрами сводят самовычисление, поиск переменных, применение, определение и присваивание в одну модель.
Вопрос для размышления
Какое окружение используется, когда выражение создает процедуру, и какое окружение используется при последующем применении этой процедуры?
Представление окружения в виде упорядоченного списка кадров
Первоочередной поиск в ближайшем кадре при поиске переменной
Захват окружения создания внутри составной процедуры
Расширение захваченного окружения новым кадром параметров при применении
Различение определения в первом кадре и присваивания существующему связыванию
Процедура model-eval обрабатывает перечисленные формы: самовычисляемые значения, переменные, quote, lambda и применение. Вычисление lambda создает данные compound-procedure, содержащие параметры, тело и текущее окружение. Применение этого значения вычисляет тело в новом кадре параметров, связанном с захваченным окружением, поэтому внутренний вызов с y по-прежнему может найти внешний x.
Вторая программа делает изменение кадров явным. Поиск находит локальный x раньше глобального x. Процедура set-variable-value! изменяет уже существующую локальную запись, тогда как define-variable! добавляет y в первый кадр. Ни одна из этих операций не изменяет глобальный x. Этот пояснительный вычислитель напрямую моделирует перечисленные формы.
Вычислитель урока возвращает (7 13). Программа изменения кадров возвращает (3 4 7 10).
На что обратить внимание в трассе
В вычислителе отделите вычисление lambda от применения процедуры и проследите за родительским окружением, захваченным каждым составным значением. В программе изменения кадров найдите ближайшее совпадение assoc, операцию set-cdr!, изменяющую локальный x, и операцию set-car!, добавляющую y только в первый кадр.
Попробуйте сами
Измените программу и сравните результат.
Добавьте if в model-eval, затем вычислите замыкание, тело которого выбирает между локальным параметром и захваченным внешним значением. Также определите глобальный y и убедитесь, что локальное определение затеняет его, а не изменяет.
Показать подсказку
Вычисляйте только выбранную ветвь if. Определение всегда направлено на первый кадр переданного окружения.