sicp.io
2.1.3 · Идентичность и мутация

Разделяемая структура и видимость мутации

Два пути могут вести к одной и той же паре. Мутация этой пары через любой из путей изменяет то, что наблюдается по обоим путям.

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

Почему разделяемая идентичность отличается от простого равенства содержимого?

  • Различение одного разделяемого объекта и двух равных объектов
  • Предсказание эффекта мутации через псевдоним
  • Чтение разделяемых ссылок в графовом представлении результата

tree сохраняет shared как в car, так и в cdr. Здесь существует одна внутренняя пара и две ссылки на нее, а не два скопированных списка. Поэтому set-car! изменяет объект, доступный по обоим путям.

Печатная метка #0= вводит разделяемый объект, а метка #0# ссылается на этот же объект повторно. Такие метки сохраняют идентичность, которую скрыла бы обычная нотация списков.

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

    Первая программа возвращает (#0=(changed) . #0#).

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

    Найдите однократное выделение памяти для разделяемой внутренней пары и одно последующее изменение. Результирующий граф сохраняет обе ссылки привязанными к одной идентичности объекта. Трасса выполнения точно фиксирует выделение памяти и разделяемое изменение в выбранном запуске.

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

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

    Запустите пример separate-pairs и сравните его результат. Объясните, почему изменение left не меняет right, хотя оба списка начинались с равного содержимого.

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

    Считайте акты выделения памяти, а не напечатанные символы в листьях.

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

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