Когда это нужно
Создайте процедуру, когда преобразованию нужно имя или его требуется передать другой процедуре. Именованная сокращённая форма читается проще; lambda удобна для небольшого локального поведения.
Проверьте запуском
(define (sum first . rest) (apply + first rest))
(sum 1 2 3 4)Наблюдаемый результат
10Разбор примера
sum требует хотя бы один аргумент. first получает 1, а rest — новый список (2 3 4). apply объединяет явный первый аргумент с этим списком и один раз вызывает +.
Как рассуждать
- Несовпадение арности даёт E302 до начала тела процедуры.
- Точечный параметр остатка получает новый правильный список оставшихся аргументов.
applyпринимает явные начальные аргументы и один последний правильный список, сохраняя хвостовую позицию.
Быстрый выбор
| Форма | Подходящее применение | Арность |
|---|---|---|
(define (f x) body) | именованная повторно используемая процедура | фиксированная |
(lambda (x y) body) | анонимная процедура-значение | фиксированная |
(lambda args body) | все аргументы одним списком | ноль или больше |
(lambda (x . rest) body) | обязательная часть и остаток | не меньше фиксированной части |
(apply f a final-list) | применение аргументов, собранных как данные | проверяет f |
Частая ошибка
Применение непроцедуры даёт E301; неправильный последний список apply — ошибка домена списка.
Текущие границы
- Для выполнения гостевых замыканий не используется
applyсреды.
Куда дальше
Справочник процедур высшего порядка показывает передачу поведения в map, filter и fold, а глава о связываниях объясняет захваченные ячейки.