Каждое лексическое связывание — изменяемая ячейка. Замыкания захватывают кадры и видят последующие изменения той же ячейки через set!.
Кратко
LISPEX
(define x 1)
(define get (lambda () x))
(set! x 2)
(get)Результат
OUTPUT
2Текущие гарантии
- Поиск выбирает ближайшую лексическую ячейку; затенение не изменяет внешнее связывание.
letrecвыделяет ячейки до инициализаторов и выдаёт E321 при чтении неинициализированной ячейки.- Повторный верхнеуровневый
defineобновляет существующую глобальную ячейку, сохраняя ссылки старых замыканий.
Границы
set!для несвязанного имени даёт E303 и не создаёт связывание.- Внутренний маркер неинициализированности нельзя представить гостевым значением.