Песочница

Замыкания и общее изменяемое состояние

Замыкание захватывает лексические ячейки, а не замороженные копии значений, поэтому связанные процедуры могут координироваться через одно закрытое связывание.

Кратко

LISPEX
(define counter (let ((n 0)) (lambda () (set! n (+ n 1)) n)))
(list (counter) (counter))

Результат

OUTPUT
(1 2)

Рабочий порядок

  • Создайте состояние во внешнем let, верните процедуры чтения/изменения и оставьте ячейку доступной только через них.
  • Затенённые связывания получают другие ячейки; set! обновляет ближайшее разрешённое связывание.
  • Верхнеуровневое переопределение обновляет исходную глобальную ячейку, видимую старым замыканиям.

Границы

  • Общее изменение здесь детерминировано, но всё равно требует узкого владения и явных тестов.