Разделяемая структура и видимость мутации
Два пути могут вести к одной и той же паре. Мутация этой пары через любой из путей изменяет то, что наблюдается по обоим путям.
Почему разделяемая идентичность отличается от простого равенства содержимого?
- Различение одного разделяемого объекта и двух равных объектов
- Предсказание эффекта мутации через псевдоним
- Чтение разделяемых ссылок в графовом представлении результата
tree сохраняет shared как в car, так и в cdr. Здесь существует одна внутренняя пара и две ссылки на нее, а не два скопированных списка. Поэтому set-car! изменяет объект, доступный по обоим путям.
Печатная метка #0= вводит разделяемый объект, а метка #0# ссылается на этот же объект повторно. Такие метки сохраняют идентичность, которую скрыла бы обычная нотация списков.
- Вывод
- —
- Значение
- —
- Диагностика
- —
Первая программа возвращает (#0=(changed) . #0#).
Найдите однократное выделение памяти для разделяемой внутренней пары и одно последующее изменение. Результирующий граф сохраняет обе ссылки привязанными к одной идентичности объекта. Трасса выполнения точно фиксирует выделение памяти и разделяемое изменение в выбранном запуске.
Измените программу и сравните результат.
Запустите пример separate-pairs и сравните его результат. Объясните, почему изменение left не меняет right, хотя оба списка начинались с равного содержимого.
Показать подсказку
Считайте акты выделения памяти, а не напечатанные символы в листьях.