Кадр применения и его родитель
Фиксируйте кадры параметров и родительские связи, пока составная процедура вызывает другую процедуру или возвращает замыкание для последующего применения.
Как одинаковые имена параметров остаются различными при вложенных и повторных применениях процедур?
- Создание одного кадра параметров для каждого применения составной процедуры
- Присоединение каждого кадра к окружению, сохраненному в процедуре
- Различение повторных кадров square с разными значениями x
- Отслеживание возвращенного замыкания от кадра создания до последующего кадра вызова
- Рассмотрение записи кадров как объяснительной модели, а не внутренних механизмов выполнения
Процедура modeled-sum-of-squares записывает один кадр, содержащий x = 3 и y = 4. Затем каждый вызов modeled-square записывает отдельный дочерний кадр, собственное связывание x которого равно 3 или 4. Повторяющееся имя параметра не перезаписывает другой вызов, поскольку каждое применение владеет собственным отдельным кадром.
Процедура make-adder записывает кадр, где x = 5, и возвращает замыкание, сохраняющее доступ к нему. Последующий вызов add-five создает кадр y = 7, связанный с этим захваченным окружением. В протоколе используются учебные имена кадров, чтобы сделать эти связи явными.
- Вывод
- —
- Значение
- —
- Диагностика
- —
Первая программа возвращает (25 ((sum-of-squares global ((x . 3) (y . 4))) (square sum-of-squares ((x . 3))) (square sum-of-squares ((x . 4))))). Вторая программа возвращает (12 ((make-adder global ((x . 5))) (returned-procedure make-adder ((y . 7))))).
Сравните смоделированные записи кадров с фактическими применениями процедур. Найдите два отдельных вызова square и родительское применение, запросившее их. При выполнении замыкания отделите возврат make-adder от последующего применения add-five и найдите место обращения к захваченному x.
Измените программу и сравните результат.
Добавьте modeled-average и вызовите ее дважды из одной смоделированной процедуры. Присвойте каждому кадру вызова отдельный числовой идентификатор и зафиксируйте как его лексического родителя, так и запросившего его вызывающего.
Показать подсказку
Лексический родитель и динамический вызывающий отвечают на разные вопросы. Сохраняйте оба поля явными в объяснительной записи.