Что такое функция?
В общем смысле функция — это правило выполнения вычисления, которому передаются входные значения, называемые аргументами. Результат вычисления называется значением или возвращаемым значением функции. Вычисление также может иметь побочные эффекты, например постоянные изменения значений переменных или содержимого структур данных (см. Определение побочного эффекта). Чистая функция — это функция, которая не имеет побочных эффектов и всегда возвращает одно и то же значение для одной и той же комбинации аргументов независимо от внешних факторов, таких как тип машины или состояние системы.
В большинстве компьютерных языков у каждой функции есть имя. Но в Lisp функция в самом строгом смысле не имеет имени: это объект, который может быть связан с символом (например, car), служащим именем функции. См. Именование функции. Когда функции присвоено имя, мы обычно также называем «функцией» этот символ (например, говорим «функция car»). В этом руководстве различие между именем функции и самим объектом функции обычно несущественно, однако мы отметим случаи, когда это важно.
Некоторые похожие на функции объекты, называемые специальными формами и макросами, также принимают аргументы для выполнения вычислений. Однако, как объясняется ниже, в Emacs Lisp они не считаются функциями.
Ниже приведены важные термины, относящиеся к функциям и похожим на функции объектам:
- лямбда-выражение
-
Функция (в строгом смысле, то есть объект функции), записанная на Lisp. Она описана в следующем разделе. См. Лямбда-выражения.
- примитив
-
Функция, вызываемая из Lisp, но фактически написанная на C. Примитивы также называются встроенными функциями или subr. К ним относятся, например, такие функции, как
carиappend. Кроме того, примитивами считаются все специальные формы (см. ниже).Обычно функция реализована как примитив, потому что она является фундаментальной частью Lisp (например,
car), предоставляет низкоуровневый интерфейс к службам операционной системы или должна выполняться быстро. В отличие от функций, определённых на Lisp, примитивы можно изменять или добавлять только путём изменения исходного кода на C и повторной компиляции Emacs. См. Написание примитивов Emacs. - специальная форма
-
Примитив, похожий на функцию, но не вычисляющий все аргументы обычным образом. Он может вычислять лишь некоторые аргументы, вычислять их в необычном порядке или вычислять несколько раз. Примеры:
if,andиwhile. См. Специальные формы. - макрос
-
Конструкция, определённая на Lisp, которая отличается от функции тем, что преобразует выражение Lisp в другое выражение, вычисляемое вместо исходного. Макросы позволяют программистам на Lisp выполнять действия, доступные специальным формам. См. Макросы.
- команда
-
Объект, который можно вызвать с помощью примитива
command-execute, обычно когда пользователь вводит последовательность клавиш, связанную с этой командой. См. Интерактивный вызов. Обычно команда является функцией; если функция написана на Lisp, формойinteractiveв определении функции её превращают в команду (см. Определение команд). Команды-функции также можно вызывать из выражений Lisp, как и другие функции.Клавиатурные макросы (строки и векторы) также являются командами, хотя и не являются функциями. См. Клавиатурные макросы. Мы называем символ командой, если его ячейка функции содержит команду (см. Компоненты символа); такую именованную команду можно вызвать с помощью M-x.
- замыкание
-
Объект функции, очень похожий на лямбда-выражение, но дополнительно содержащий окружение лексических привязок переменных. См. Замыкания.
- байт-компилированная функция
-
Функция, скомпилированная байт-компилятором. См. Тип функции-замыкания.
- объект автозагрузки
Заглушка для настоящей функции. При вызове объекта автозагрузки Emacs загружает файл с определением настоящей функции, а затем вызывает эту функцию. См. Автозагрузка.
Чтобы проверить, является ли объект функцией, можно использовать функцию functionp:
- Функция: functionp object
-
Эта функция возвращает
t, если object является функцией любого вида, то есть может быть передан вfuncall. Обратите внимание:functionpвозвращаетtдля символов, являющихся именами функций, иnilдля символов, являющихся макросами или специальными формами.Если object не является функцией, эта функция обычно возвращает
nil. Однако представление объектов-функций сложно, и в редких случаях ради эффективности эта функция может вернутьt, даже если object не является функцией.
Также можно узнать, сколько аргументов ожидает произвольная функция:
- Функция: func-arity function
-
Эта функция предоставляет сведения о списке аргументов указанной function. Возвращаемое значение — конс-ячейка вида
(min . max), где min — минимальное число аргументов, а max — максимальное число аргументов, символmanyдля функций с аргументами&restили символunevalled, если function является специальной формой.Обратите внимание, что в некоторых ситуациях эта функция может возвращать неточные результаты, например:
- Функции, определённые с помощью
apply-partially(см. apply-partially). - Функции, к которым применены советы с помощью
advice-add(см. Добавление советов к именованным функциям). - Функции, которые определяют список аргументов динамически, в своём коде.
- Функции, определённые с помощью
В отличие от functionp, следующие функции не рассматривают символ как его определение функции.
- Функция: subrp object
-
Эта функция возвращает
t, если object является встроенной функцией (то есть примитивом Lisp).(subrp 'message) ;
messageis a symbol, ⇒ nil ; not a subr object.(subrp (symbol-function 'message)) ⇒ t
- Функция: byte-code-function-p object
-
Эта функция возвращает
t, если object является байт-кодированной функцией. Например:(byte-code-function-p (symbol-function 'next-line)) ⇒ t
- Функция: compiled-function-p object
Эта функция возвращает
t, если object является объектом-функцией, представленным не в виде исходного кода Lisp, а, например, в виде машинного кода или байт-кода. Точнее, она возвращаетt, если функция является встроенной (то есть «примитивом», см. Что такое функция?), байт-компилированной (см. Байт-компиляция), скомпилированной в машинный код (см. Компиляция Lisp в машинный код) или загруженной из динамического модуля (см. Динамические модули Emacs).
- Функция: interpreted-function-p object
Эта функция возвращает
t, если object является интерпретируемой функцией.
- Функция: closurep object
Эта функция возвращает
t, если object является замыканием — особым видом объекта-функции. В настоящее время замыкания используются для всех байт-кодированных и всех интерпретируемых функций.
- Функция: subr-arity subr
Работает как
func-arity, но только для встроенных функций и без перенаправления через символ. Для невстроенных функций выдаёт ошибку. Рекомендуем вместо неё использоватьfunc-arity.
- Функция: cl-functionp object
Эта функция похожа на
functionp, но возвращаетnilдля списков и символов.
- Функция: primitive-function-p object
Эта функция возвращает
t, если object является встроенным примитивом, написанным на C (см. Тип примитивной функции). Обратите внимание, что специальные формы явно исключены, поскольку они не являются функциями. Если требуется также распознавать специальные формы, используйтеsubr-primitive-p.
Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/What-Is-a-Function.html