Песочница

Процедуры, арность, применение и apply

Замыкания с фиксированной и точечной арностью используют лексическую область, детерминированное вычисление аргументов и общий диспетчер применения для прямых вызовов и `apply`.

Когда это нужно

Создайте процедуру, когда преобразованию нужно имя или его требуется передать другой процедуре. Именованная сокращённая форма читается проще; lambda удобна для небольшого локального поведения.

Проверьте запуском

LISPEX
(define (sum first . rest) (apply + first rest))
(sum 1 2 3 4)

Наблюдаемый результат

OUTPUT
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, а глава о связываниях объясняет захваченные ячейки.

Процедуры высшего порядка · Связывания и область