Замыкание захватывает лексические ячейки, а не замороженные копии значений, поэтому связанные процедуры могут координироваться через одно закрытое связывание.
Кратко
LISPEX
(define counter (let ((n 0)) (lambda () (set! n (+ n 1)) n)))
(list (counter) (counter))Результат
OUTPUT
(1 2)Рабочий порядок
- Создайте состояние во внешнем
let, верните процедуры чтения/изменения и оставьте ячейку доступной только через них. - Затенённые связывания получают другие ячейки;
set!обновляет ближайшее разрешённое связывание. - Верхнеуровневое переопределение обновляет исходную глобальную ячейку, видимую старым замыканиям.
Границы
- Общее изменение здесь детерминировано, но всё равно требует узкого владения и явных тестов.