Изменяемый объект против неизменяемого потока
Одни и те же детерминированные значения дают скрытое изменяемое начальное значение и поток, чье следующее состояние является отложенным аргументом.
Какие зависимости становятся видимыми, когда состояние представляется в виде потока, а не скрывается внутри объекта?
- Реализация одного рекуррентного соотношения с помощью объекта-генератора с состоянием
- Реализация того же рекуррентного соотношения в виде неизменяемого отложенного потока
- Сравнение одинаковых конечных наблюдений в двух структурах процессов
- Сброс объекта через изменение и перезапуск потока через повторное конструирование
- Выбор модели в соответствии с интерфейсами и историями, необходимыми клиенту
Процедура make-rand скрывает seed и изменяет его при каждом сообщении generate. Поток random-stream вместо этого явно получает текущее значение seed, вычисляет next, помещает его в поток и откладывает конструирование из этого значения next. Обе реализации используют одно и то же рекуррентное соотношение и поэтому выдают одинаковые первые пять чисел для seed 1.
Сбрасываемый объект изменяет свой закрытый seed на месте. Функциональная версия перезапускается путем создания нового потока из seed 1, при этом старый поток остается доступным. Одинаковые списки результатов подтверждают совпадение только для этого конечного префикса. Объект подчеркивает идентичность и команды, тогда как поток подчеркивает повторно используемые истории и явный поток данных.
- Вывод
- —
- Значение
- —
- Диагностика
- —
Первая программа возвращает последовательность (48271 182605794 1291394886 1914720637 2078669041) дважды, за которой следует #t. Программа со сбросом возвращает (48271 182605794 reset 48271 48271 182605794).
Проследите за set! в закрытом seed объекта и сравните это с явным аргументом next, захваченным каждым promise потока. При запуске со сбросом отличайте изменение идентичности одного объекта от создания и сохранения отдельной истории потока.
Измените программу и сравните результат.
Отобразите обе модели в конечный поток или список наблюдений even?, затем разветвите функциональный поток на двух потребителей, продолжая работу с единым объектом. Объясните, какие истории можно воспроизвести повторно без сброса.
Показать подсказку
Мемоизированный хвост потока может разделяться несколькими потребителями. Объект с состоянием имеет только одно текущее положение, если его протокол явно не сохраняет историю.