sicp.io
3.1.2 · Преимущества введения присваивания

Собственная ячейка памяти и стабильный интерфейс

Присваивание прячет средства измерений и ход эксперимента за стабильными интерфейсами процедур вместо сквозной передачи служебных данных.

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

Когда скрытое состояние упрощает взаимодействие процедур, которые в остальном независимы друг от друга?

  • Инкапсуляция счетчика вызовов за одной отслеживаемой процедурой
  • Разделение обычных запросов и сообщений count и reset
  • Запоминание следующего результата в конечном эксперименте
  • Отделение управления Монте-Карло от хранения состояния эксперимента
  • Определение границы воспроизводимости явного конечного расписания

Процедура make-monitored добавляет к произвольной процедуре одно закрытое связывание calls. Обычные числовые сообщения увеличивают значение связывания и делегируют вызов обернутой процедуре. Сообщения count и reset позволяют проверять или изменять данные мониторинга, не требуя от каждого вызывающего передавать значение счетчика вместе с настоящим аргументом.

Вторая программа отделяет контроллер Монте-Карло от объекта эксперимента с состоянием. Процедура monte-carlo знает только то, что вызов experiment возвращает следующий булев результат. Переданный конечный список делает этот запуск воспроизводимым и напрямую моделирует модульное преимущество присваивания.

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

    Программа с отслеживанием возвращает (9 16 2 reset 0). Конечный эксперимент возвращает ((3 5 3/5) exhausted).

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

    Найдите закрытое связывание calls и отличите обычное делегирование от сообщений count и reset. В эксперименте проследите за присваиванием cdr после каждого результата и убедитесь, что monte-carlo никогда не обращается к списку результатов напрямую.

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

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

    Добавьте в make-monitored сообщение last-result, затем создайте два эксперимента из одного и того же списка результатов и чередуйте их вызовы. Предскажите, какие закрытые ячейки памяти могут повлиять друг на друга.

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

    Каждый вызов конструктора создает собственные ячейки памяти. Контроллер должен по-прежнему использовать только процедурный интерфейс experiment.

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

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