Песочница

Процедуры высшего порядка

`map`, `filter`, `reduce`, свёртки, `for-each`, варианты для векторов и строк и `apply` вызывают гостевые процедуры через общий путь вычислителя.

Проверьте запуском

LISPEX
(fold-right cons (list) (list 1 2 3))

Наблюдаемый результат

OUTPUT
(1 2 3)

Как рассуждать

  • Списки, строки и векторы обходятся слева направо. Исключение — fold-right: он вызывает (f element accumulator) справа налево.
  • reduce и fold-left — одна левая свёртка с вызовом (f accumulator element).
  • all? и any? останавливаются, как только ответ известен, и принимают от предиката только #t или #f. filter использует обычную истинность Лиспекса.
  • for-each выполняется ради эффекта, отбрасывает любое число значений callback и сам возвращает ноль значений.
  • Ошибки и одноразовые выходы callback остаются в гостевом вычислителе. LIL не передаёт процедуру в host apply или callback среды.

Контракты функций обратного вызова

СигнатураОбход / результатКонтекст значений
(map proc list)слева направо; новый правильный списокфункция возвращает ровно одно значение
(filter predicate list)слева направо; сохранённые элементыпредикат возвращает ровно одно значение; исключает только #f
(all? predicate list), (any? predicate list)слева направо с коротким замыканием; строгий booleanпредикат возвращает ровно один boolean
(reduce proc init list), (fold-left proc init list)левый аккумуляторфункция возвращает ровно одно значение
(fold-right proc init list)правый аккумуляторфункция возвращает ровно одно значение
(string-map proc string), (vector-map proc vector)слева направо; новый результатровно одно значение; для строки — символ
строковый/векторный/списочный for-eachэффекты слева направо; итог — ноль значенийрезультаты callback отбрасываются
(apply proc arg ... final-list)общий диспетчер; хвостовая безопасностьпакет результата процедуры сохранён

Частая ошибка

Эти процедуры принимают одну коллекцию, а не варианты с несколькими списками из некоторых реализаций Scheme. Символы строки и элементы вектора копируются до первого callback, поэтому изменение исходного вектора не меняет обход.

Куда дальше

Держите эту страницу рядом при написании кода. За последовательным объяснением вернитесь к карте синтаксиса или соответствующей главе.

Синтаксис одним взглядом · Путь обучения