Это предыдущая редакция документации. Актуальные требования к аргументам, результаты и порядок обхода описаны в разделе «Процедуры высшего порядка».
Эта страница представляет собой справочник по основным функциям высшего порядка в Lispex. Эти функции принимают другие функции как аргументы и помогают обрабатывать списки декларативно.
map
Применяет заданную функцию к каждому элементу списка и возвращает новый список, содержащий результаты. Новый список всегда будет иметь такое же количество элементов, как и исходный.
- Синтаксис:
(map FUNCTION LIST) - Аргументы:
FUNCTION: Функция, которая принимает один аргумент (элемент списка) и возвращает преобразованное значение.LIST: Список для итерации.- Возвращает: Новый список, содержащий преобразованные элементы.
- Выбрасывает:
RuntimeError, если аргументы не являются функцией и списком соответственно.
Пример:
;; Создать новый список, где каждое число возведено в квадрат.
(map (lambda (n) (* n n)) (list 1 2 3 4))
;; Результат: (list 1 4 9 16)filter
Возвращает новый список, содержащий только те элементы из исходного списка, для которых заданная функция-предикат возвращает истинное значение (любое значение, отличное от #f).
- Синтаксис:
(filter PREDICATE_FUNCTION LIST) - Аргументы:
PREDICATE_FUNCTION: Функция, которая принимает один аргумент и возвращает булево (#tоставить элемент,#fотбросить).LIST: Список для фильтрации.- Возвращает: Новый список, который может быть короче или такой же длины, как и исходный.
- Выбрасывает:
RuntimeError, если аргументы не являются функцией и списком соответственно.
Пример:
;; Создать новый список только с числами больше 5.
(filter (lambda (n) (> n 5)) (list 2 8 4 10 5 7))
;; Результат: (list 8 10 7)reduce
Сводит список к одному значению, многократно применяя функцию. Она итерирует по списку, поддерживая "аккумулятор", который обновляется на каждом шаге.
- Синтаксис:
(reduce FUNCTION INITIAL_VALUE LIST) - Аргументы:
FUNCTION: Функция, которая принимает два аргумента:(аккумулятор, текущий_элемент). Она должна возвращать новое значение аккумулятора.INITIAL_VALUE: Начальное значение для аккумулятора.LIST: Список для свертки.- Возвращает: Конечное значение аккумулятора после итерации по всему списку.
- Выбрасывает:
RuntimeError, если аргументы не являются функцией, значением и списком.
Пример: Суммирование всех чисел в списке
(reduce (lambda (sum el) (+ sum el))
0
(list 10 20 30 40))
;; Результат: 100Пример: Поиск самого длинного слова в списке
(reduce (lambda (longest word)
(if (> (length word) (length longest))
word
longest))
""
(list "Lispex" "is" "a" "delightful" "language"))
;; Результат: "прекрасный"fold-left
Сворачивает список в одно значение слева, от первого элемента к последнему. fold-left это имя из R6RS для той же операции, что и reduce. Функция получает аккумулятор первым, а текущий элемент вторым.
- Синтаксис:
(fold-left FUNCTION INITIAL_VALUE LIST) - Аргументы:
FUNCTION: Функция(аккумулятор текущий_элемент), возвращающая новый аккумулятор.INITIAL_VALUE: Начальное значение аккумулятора.LIST: Список для свёртки.
- Возвращает: Итоговый аккумулятор (
INITIAL_VALUE, если список пуст). - Выбрасывает:
RuntimeError, если аргументы не являются функцией, значением и списком.
Пример:
(fold-left - 0 (list 1 2 3))
;; Результат: -6fold-right
Сворачивает список справа (от последнего элемента к первому). В отличие от fold-left, функция получает текущий элемент первым, а аккумулятор вторым, поэтому (fold-right cons (list) …) восстанавливает список без изменений.
- Синтаксис:
(fold-right FUNCTION INITIAL_VALUE LIST) - Аргументы:
FUNCTION: Функция(текущий_элемент аккумулятор), возвращающая новый аккумулятор.INITIAL_VALUE: Аккумулятор, используемый на правом конце списка.LIST: Список для свёртки.
- Возвращает: Итоговый аккумулятор (
INITIAL_VALUE, если список пуст). - Выбрасывает:
RuntimeError, если аргументы не являются функцией, значением и списком.
Пример:
(fold-right cons (list) (list 1 2 3))
;; Результат: (list 1 2 3)
(fold-right - 0 (list 1 2 3))
;; Результат: 2apply
Вызывает функцию со списком аргументов. Аргументы перед последним передаются первыми, затем элементы последнего списка подставляются как остальные аргументы. Последний аргумент должен быть списком. apply является хвостовым вызовом.
(apply + (list 1 2 3 4)) ;; Результат: 10values и call-with-values
values возвращает ноль или больше значений из одного выражения.
call-with-values соединяет thunk-производитель с процедурой-потребителем:
значения, созданные производителем, становятся аргументами потребителя. На
верхнем уровне несколько значений печатаются по одному на строку. В позиции,
где требуется одно значение, ноль или несколько значений дают ошибку времени
выполнения.
В обновлении v1.4 этот путь множественных значений проходит через нативный интерпретатор, браузерную/Node WASM-сборку, Meaning Environment и same-origin проверки согласия бэкендов.
for-each
Применяет функцию к каждому элементу списка слева направо ради побочных эффектов, отбрасывая результаты, и возвращает неопределённое значение. Если нужны собранные результаты, используйте map.
(for-each display (list 1 2 3))
;; печатает: 123