Проверьте запуском
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, поэтому изменение исходного вектора не меняет обход.
Куда дальше
Держите эту страницу рядом при написании кода. За последовательным объяснением вернитесь к карте синтаксиса или соответствующей главе.