sicp.io
3.2.3 · Замыкания и ячейки памяти

Собственная ячейка памяти у каждого замыкания

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

Вопрос для размышления

Почему два счетчика, созданные одной процедурой, не перезаписывают значения друг друга?

  • Связывание замыкания с окружением его создания
  • Разделение одинакового кода процедуры и различных ячеек памяти
  • Предсказание наблюдаемых значений для разделяемых и закрытых связываний

Каждый вызов make-counter создает новое связывание value и возвращает процедуру, которая сохраняет к нему доступ. Процедуры left и right разделяют выражение lambda, но не разделяют само связывание.

Второй пример выносит value за пределы обеих процедур. Эта единственная ячейка становится общей, поэтому обновление через любую из процедур задает начальное значение для другой.

Код SICP246 из 1,048,576 байт UTF-8
Примеры
Результат
Вывод
Значение
Диагностика
Трасса выполнения0 / 0 событий
    Запуски происходят внутри браузера с отображением результата программы и трассы выполнения.
    Ожидаемый результат

    Первая программа возвращает (1 2 11 3 12).

    На что обратить внимание в трассе

    Сравните два применения make-counter с последующими вызовами left и right. Повторяющееся тело lambda обращается к ячейке, захваченной окружением его создания.

    Попробуйте сами

    Измените программу и сравните результат.

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

    Показать подсказку

    Посчитайте вызовы make-counter. Каждый вызов создает одно новое закрытое связывание value.

    Завершить этот урок

    В этой главе пройдено 0 из 21 урока0%