Внутренние определения как локальная программа
Вызов процедуры создает окружение для нескольких вспомогательных процедур, включая взаимно рекурсивные, чьи ссылки работают после установки определений.
Как несколько локальных процедур могут ссылаться друг на друга без утечки своих имен во внешнее окружение?
- Отличие локального определения от глобального связывания
- Отслеживание взаимно рекурсивных вспомогательных процедур в едином окружении вызова
- Объяснение разрешения ссылок на вспомогательные процедуры при применении замыканий
- Моделирование scan-out как создания связываний до того, как присваивания установят значения процедур
- Разделение явного маркера unassigned и корректного значения процедуры
Процедура classify-parity создает процедуры even-step и odd-step внутри каждого вызова. Оба замыкания разделяют окружение вызова, поэтому even-step может вызывать odd-step, а odd-step может вызывать even-step, хотя ни одно из этих имен не становится глобальным. Вызовы происходят только после того, как оба локальных определения обработаны. Новый вызов classify-parity создает отдельную закрытую группу связываний.
Вторая программа рассматривает определения как цитированные данные и формирует структуру scan-out, используемую для анализа одновременной локальной области: сначала для каждого имени создается связывание с явным маркером unassigned, затем каждая процедура устанавливается через set!, после чего вычисляется оставшееся тело. Этот запуск строит преобразование в виде данных и делает явной структуру unassigned и set!.
- Вывод
- —
- Значение
- —
- Диагностика
- —
Первая программа возвращает ((#f #t) (#t #f)). Вторая программа возвращает форму let со связываниями even-step и odd-step с цитированными маркерами *unassigned*, за которой следуют две формы set! и исходное тело.
В первом запуске найдите окружение, созданное процедурой classify-parity, и проследите за чередующимися применениями без поиска even-step или odd-step в глобальном окружении. Во втором запуске разделите чтение цитированных данных определений и построение связываний, значений lambda, присваиваний и итогового тела. Сгенерированная форма служит объяснительной моделью для этих конечных входных данных и делает видимым каждый шаг преобразования.
Измените программу и сравните результат.
Добавьте группу локальных вспомогательных процедур divisible-by-three?, циклически переключающуюся между тремя взаимно рекурсивными процедурами. Сохраните все имена вспомогательных процедур внутри одной публичной процедуры классификации и предскажите результаты для 8 и 9.
Показать подсказку
Каждая вспомогательная процедура представляет один класс остатков и вызывает следующую вспомогательную процедуру после вычитания 1. Только процедура для нулевого остатка возвращает true при значении 0.