sicp.io
4.2.4 · Потоки как ленивые списки

Ленивые списки на нестрогом cons

Определите пары, селекторы, бесконечные списки, map и take внутри guest-языка, чтобы отложенные аргументы составных процедур обеспечивали поведение потока.

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

Что происходит с абстракцией списков, когда вычислитель автоматически откладывает каждый операнд составной процедуры?

  • Определение lazy-cons как обычной составной процедуры в языке guest
  • Выбор головы без форсирования отложенного параметра хвоста
  • Создание самоссылающегося бесконечного связывания ones
  • Рекурсивное порождение неограниченного списка целых чисел
  • Отображение процедуры guest на ленивый список без построения его полного хвоста
  • Использование строгого конечного потребителя для запроса точного конечного списка результатов

lazy-cons записывается как процедура, возвращающая процедуру-селектор. В ленивом вычислителе ее параметры x и y являются thunk. lazy-car применяет пару к селектору, возвращающему x, поэтому y остается нефорсированным. Глобальное определение ones поэтому может ссылаться на ones в собственном отложенном хвосте: это обращение не запрашивается, пока lazy-cdr не дойдет до него после создания связывания.

integers-from и lazy-map используют тот же обычный рекурсивный синтаксис. Их рекурсивные вызовы передаются как отложенные операнды y в lazy-cons, поэтому бесконечный остаток представлен мемоизированными thunk вычислителя. take служит границей требования: примитивному cons нужны фактические значения аргументов, поэтому он форсирует ровно запрошенное число голов и хвостов в конечный базовый список. Этот пример объединяет ленивые списки с вычислителем урока и делает требование потребителя явным.

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

    Самоссылающийся список возвращает (1 1 1 1 1). Список отображенных целых чисел возвращает (1 4 9 16 25 36).

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

    Найдите каждое применение lazy-cons и проверьте отложенный операнд y. При запуске ones убедитесь, что самоссылка впервые форсируется только через lazy-cdr после того, как define установил связывание. При запуске с отображением подсчитайте, сколько применений integers-from и square запрашивает take, вместо представления завершенного бесконечного списка.

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

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

    Определите lazy-filter и извлеките первые пять четных целых чисел. Затем запросите тот же префикс дважды и проверьте, какие thunk вычислителя используются повторно после мемоизации.

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

    Если значение не проходит предикат, продолжайте с отложенным хвостом. Если проходит, создайте один lazy-cons, чей рекурсивный вызов filter останется отложенным вторым аргументом.

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

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