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.

замыкание

Объект функции, очень похожий на лямбда-выражение, за исключением того, что он также включает окружение связываний лексических переменных. См. Замыкания.

функция байткода

Функция, которая была скомпилирована байт-компилятором. См. Тип байткода.

объект autoload

Заполнитель для реальной функции. Если вызывается объект autoload, Emacs загружает файл, содержащий определение реальной функции, а затем вызывает реальную функцию. См. Autoload.

Вы можете использовать функцию functionp для проверки, является ли объект функцией:

Функция: functionp объект

Эта функция возвращает t если объект является любым видом функции, то есть может быть передан в funcall. Обратите внимание, что functionp возвращает t для символов, которые являются именами функций, и возвращает nil для специальных форм.

Также возможно узнать, сколько аргументов ожидает произвольная функция:

Функция: func-arity функция

Эта функция предоставляет информацию о списке аргументов указанной функции. Возвращаемое значение — это ячейка cons вида (min . max), где min — минимальное количество аргументов, а max — либо максимальное количество аргументов, либо символ many для функций с &rest аргументами, либо символ unevalled если функция является специальной формой.

Обратите внимание, что эта функция может возвращать неточные результаты в некоторых ситуациях, таких как:

  • - Функции, определенные с помощью apply-partially (см. apply-partially).
  • - Функции, которые консультированы с помощью advice-add (см. Консультирование именованных функций).
  • - Функции, которые динамически определяют список аргументов в рамках своего кода.

В отличие от functionp, следующие три функции не обрабатывают символ как его определение функции.

Функция: subrp объект

Эта функция возвращает t если объект является встроенной функцией (то есть примитивом Lisp).

(subrp 'message)            ; message is a symbol,
     ⇒ nil                 ;   not a subr object.
(subrp (symbol-function 'message))
     ⇒ t
Функция: byte-code-function-p объект

Эта функция возвращает t если объект является функцией байткода. Например:

(byte-code-function-p (symbol-function 'next-line))
     ⇒ t
Функция: subr-arity subr

Это работает как func-arity, но только для встроенных функций и без косвенной ссылки на символ. Она сигнализирует об ошибке для функций, не являющихся встроенными. Мы рекомендуем использовать func-arity вместо этого.

Copyright © 1990-1996, 1998-2022 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