Spec-Zone.ru › Elisp

Что такое функция?

В общем смысле функция — это правило выполнения вычисления, которому передаются входные значения, называемые аргументами. Результат вычисления называется значением или возвращаемым значением функции. Вычисление также может иметь побочные эффекты, например постоянные изменения значений переменных или содержимого структур данных (см. Определение побочного эффекта). Чистая функция — это функция, которая не имеет побочных эффектов и всегда возвращает одно и то же значение для одной и той же комбинации аргументов независимо от внешних факторов, таких как тип машины или состояние системы.

В большинстве компьютерных языков у каждой функции есть имя. Но в 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)            ; message is 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API