Песочница

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

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 выполняется ради эффекта, отбрасывает любое число значений функции обратного вызова и сам возвращает ноль значений.
  • Ошибки и одноразовые выходы функции обратного вызова остаются внутри программы, выполняющей правило. LIL не передаёт процедуру в apply хоста или в функцию обратного вызова хоста.

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

СигнатураОбход / результатКонтекст значений
(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эффекты слева направо, в итоге ноль значенийрезультаты обратного вызова отбрасываются
(apply proc arg ... final-list)общий диспетчер, хвостовая безопасностьвсе значения, которые вернула процедура, сохраняются

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

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

Куда дальше

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

Работа с map, filter, fold и apply · Указатель процедур