Песочница

Функциональная библиотека

Функции высшего порядка, такие как map, filter и reduce, для обработки списков в Lispex.

Это предыдущая редакция документации. Актуальные требования к аргументам, результаты и порядок обхода описаны в разделе «Процедуры высшего порядка».

Эта страница представляет собой справочник по основным функциям высшего порядка в Lispex. Эти функции принимают другие функции как аргументы и помогают обрабатывать списки декларативно.


map

Применяет заданную функцию к каждому элементу списка и возвращает новый список, содержащий результаты. Новый список всегда будет иметь такое же количество элементов, как и исходный.

  • Синтаксис: (map FUNCTION LIST)
  • Аргументы:
  • FUNCTION: Функция, которая принимает один аргумент (элемент списка) и возвращает преобразованное значение.
  • LIST: Список для итерации.
  • Возвращает: Новый список, содержащий преобразованные элементы.
  • Выбрасывает: RuntimeError, если аргументы не являются функцией и списком соответственно.

Пример:

LISPEX
;; Создать новый список, где каждое число возведено в квадрат.
(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, если аргументы не являются функцией и списком соответственно.

Пример:

LISPEX
;; Создать новый список только с числами больше 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, если аргументы не являются функцией, значением и списком.

Пример: Суммирование всех чисел в списке

LISPEX
(reduce (lambda (sum el) (+ sum el))
        0
        (list 10 20 30 40))
;; Результат: 100

Пример: Поиск самого длинного слова в списке

LISPEX
(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, если аргументы не являются функцией, значением и списком.

Пример:

LISPEX
(fold-left - 0 (list 1 2 3))
;; Результат: -6

fold-right

Сворачивает список справа (от последнего элемента к первому). В отличие от fold-left, функция получает текущий элемент первым, а аккумулятор вторым, поэтому (fold-right cons (list) …) восстанавливает список без изменений.

  • Синтаксис: (fold-right FUNCTION INITIAL_VALUE LIST)
  • Аргументы:
    • FUNCTION: Функция (текущий_элемент аккумулятор), возвращающая новый аккумулятор.
    • INITIAL_VALUE: Аккумулятор, используемый на правом конце списка.
    • LIST: Список для свёртки.
  • Возвращает: Итоговый аккумулятор (INITIAL_VALUE, если список пуст).
  • Выбрасывает: RuntimeError, если аргументы не являются функцией, значением и списком.

Пример:

LISPEX
(fold-right cons (list) (list 1 2 3))
;; Результат: (list 1 2 3)

(fold-right - 0 (list 1 2 3))
;; Результат: 2

apply

Вызывает функцию со списком аргументов. Аргументы перед последним передаются первыми, затем элементы последнего списка подставляются как остальные аргументы. Последний аргумент должен быть списком. apply является хвостовым вызовом.

LISPEX
(apply + (list 1 2 3 4))   ;; Результат: 10

values и call-with-values

values возвращает ноль или больше значений из одного выражения. call-with-values соединяет thunk-производитель с процедурой-потребителем: значения, созданные производителем, становятся аргументами потребителя. На верхнем уровне несколько значений печатаются по одному на строку. В позиции, где требуется одно значение, ноль или несколько значений дают ошибку времени выполнения.

В обновлении v1.4 этот путь множественных значений проходит через нативный интерпретатор, браузерную/Node WASM-сборку, Meaning Environment и same-origin проверки согласия бэкендов.


for-each

Применяет функцию к каждому элементу списка слева направо ради побочных эффектов, отбрасывая результаты, и возвращает неопределённое значение. Если нужны собранные результаты, используйте map.

LISPEX
(for-each display (list 1 2 3))
;; печатает: 123