Собственная ячейка памяти у каждого замыкания
Две процедуры, созданные одним и тем же конструктором, могут выполнять один и тот же код, сохраняя различные связывания.
Почему два счетчика, созданные одной процедурой, не перезаписывают значения друг друга?
- Связывание замыкания с окружением его создания
- Разделение одинакового кода процедуры и различных ячеек памяти
- Предсказание наблюдаемых значений для разделяемых и закрытых связываний
Каждый вызов make-counter создает новое связывание value и возвращает процедуру, которая сохраняет к нему доступ. Процедуры left и right разделяют выражение lambda, но не разделяют само связывание.
Второй пример выносит value за пределы обеих процедур. Эта единственная ячейка становится общей, поэтому обновление через любую из процедур задает начальное значение для другой.
- Вывод
- —
- Значение
- —
- Диагностика
- —
Первая программа возвращает (1 2 11 3 12).
Сравните два применения make-counter с последующими вызовами left и right. Повторяющееся тело lambda обращается к ячейке, захваченной окружением его создания.
Измените программу и сравните результат.
Создайте третий счетчик с начальным значением 100. Чередуйте вызовы всех трех счетчиков и предскажите, какие вызовы могут повлиять друг на друга.
Показать подсказку
Посчитайте вызовы make-counter. Каждый вызов создает одно новое закрытое связывание value.