Песочница

Связывания, область, ячейки и изменение

Каждое лексическое связывание — изменяемая ячейка. Замыкания захватывают кадры и видят последующие изменения той же ячейки через set!.

Кратко

LISPEX
(define x 1)
(define get (lambda () x))
(set! x 2)
(get)

Результат

OUTPUT
2

Текущие гарантии

  • Поиск выбирает ближайшую лексическую ячейку; затенение не изменяет внешнее связывание.
  • letrec выделяет ячейки до инициализаторов и выдаёт E321 при чтении неинициализированной ячейки.
  • Повторный верхнеуровневый define обновляет существующую глобальную ячейку, сохраняя ссылки старых замыканий.

Границы

  • set! для несвязанного имени даёт E303 и не создаёт связывание.
  • Внутренний маркер неинициализированности нельзя представить гостевым значением.