sicp.io
3.3.6 · Отношения через разделяемое состояние

Двустороннее распространение ограничений

Соединители запоминают значения и источники, поэтому сумматор выводит любое недостающее слагаемое и отзывает только зависимые сведения.

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

Как одно отношение может правильно реагировать независимо от того, какие два значения поступят первыми?

  • Явное представление значения соединителя, источника информации и списка ограничений
  • Уведомление связанных ограничений при появлении или исчезновении сведений
  • Использование отношения сумматора для вывода любого из трех его значений
  • Отзыв зависимых сведений без удаления независимых пользовательских значений

Каждый соединитель хранит признак наличия значения, само значение, источник его установки и список ограничений для уведомления. Операция set-value! принимает первое значение и отправляет сообщение new-value каждому ограничению кроме установившего источника. Поэтому сумматор может вычислить total по двум слагаемым или любое слагаемое по total и другому слагаемому.

Операция forget-value! выполняется успешно только тогда, когда отзывающая сторона совпадает с сохраненным источником информации. Когда пользователь забывает значение total, сумматор отзывает значение right, поскольку сам предоставил это выведенное значение, но не может отозвать независимо переданное значение left. Передача нового значения right выводит новое значение total через то же самое отношение.

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

    Первая программа возвращает (10 32 42). Вторая программа возвращает ((10 32 42) (#t #f #f) 15).

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

    Проследите за каждым уведомлением соединителя, направленным сумматору. Во втором запуске отличите установленное пользователем значение left от вычисленного сумматором значения right, а затем наблюдайте, как сообщение lost-value отзывает только выведенный путь до того, как распространится новое значение total.

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

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

    Во второй программе забудьте значение left вместо total. Предскажите, какие соединители потеряют значения и какое переданное пользователем значение останется.

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

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

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

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