Spec-Zone.ru › Elisp

Определение функций

Обычно мы даём функции имя при её создании. Это называется определением функции; обычно для этого используется макрос defun. В этом разделе также описаны другие способы определения функции.

Макрос: defun name args [doc] [declare] [interactive] body…

defun — обычный способ определения новых функций Lisp. Он определяет символ name как функцию со списком аргументов args (см. Особенности списков аргументов) и формами тела, заданными в body. Ни name, ни args не следует заключать в кавычки.

Если задано doc, оно должно быть строкой, задающей строку документации функции (см. Строки документации функций). Если задано declare, это должна быть форма declare, задающая метаданные функции (см. Форма declare). Если задано interactive, это должна быть форма interactive, задающая способ интерактивного вызова функции (см. Интерактивный вызов).

Возвращаемое значение defun не определено.

Примеры:

(defun foo () 5)
(foo)
     ⇒ 5
(defun bar (a &optional b &rest c)
    (list a b c))
(bar 1 2 3 4 5)
     ⇒ (1 2 (3 4 5))
(bar 1)
     ⇒ (1 nil nil)
(bar)
error→ Wrong number of arguments.
(defun capitalize-backwards ()
  "Upcase the last letter of the word at point."
  (interactive)
  (backward-word 1)
  (forward-word 1)
  (backward-char 1)
  (capitalize-word 1))

Большинство функций Emacs входят в исходный код программ Lisp и определяются, когда считыватель Emacs Lisp читает исходный текст программы перед её выполнением. Однако вы также можете определять функции динамически во время выполнения, например, генерируя вызовы defun при выполнении кода программы. Если вы так поступаете, учтите, что команды справки Emacs, такие как C-h f, которые отображают в буфере *Help* кнопку для перехода к определению функции, могут не найти исходный код, поскольку динамическая генерация функции обычно сильно отличается от обычных статических вызовов defun. Поиск кода, генерирующего такие функции, можно упростить, используя свойство definition-name или find-function-type-alist; см. Стандартные свойства символов.

Будьте осторожны и не переопределяйте существующие функции случайно. defun без колебаний и предупреждений переопределяет даже примитивные функции, такие как car. Emacs не препятствует этому, поскольку иногда переопределение функции выполняется намеренно, а отличить намеренное переопределение от случайного невозможно.

Функция: defalias name definition &optional doc

Эта функция определяет символ name как функцию с определением definition. definition может быть любой допустимой функцией или макросом Lisp, специальной формой (см. Специальные формы), раскладкой клавиатуры (см. Раскладки клавиатуры) либо вектором или строкой (клавиатурным макросом). Возвращаемое значение defalias не определено.

Если doc не равно nil, оно становится строкой документации функции name. В противном случае используется документация, предоставленная в definition.

Обычно внутри defalias для задания определения используется fset. Однако если у name есть свойство defalias-fset-function, связанное с ним значение используется как функция, вызываемая вместо fset.

defalias следует использовать при определении конкретного имени функции или макроса — особенно если это имя явно указано в загружаемом исходном файле. Это связано с тем, что defalias записывает, в каком файле была определена функция, как и defun (см. Выгрузка).

Напротив, в программах, которые изменяют определения функций для других целей, лучше использовать fset, который не сохраняет такие записи. См. Доступ к содержимому ячеек функций.

Если получившаяся цепочка определений функции будет циклической, Emacs выдаст ошибку cyclic-function-indirection.

Функция: function-alias-p object

Проверяет, является ли object псевдонимом функции. Если да, возвращает список символов, представляющих цепочку псевдонимов функции; в противном случае возвращает nil. Например, если a является псевдонимом b, а b — псевдонимом c:

(function-alias-p 'a)
    ⇒ (b c)

Есть также второй необязательный аргумент, который устарел и не оказывает никакого эффекта.

С помощью defun или defalias нельзя создать новую примитивную функцию, но их можно использовать, чтобы изменить определение функции любого символа, даже такого, как car или x-popup-menu, обычное определение которого является примитивом. Однако это рискованно: например, переопределить car, не нарушив работу Lisp, практически невозможно. Переопределять малозаметную функцию, такую как x-popup-menu, менее опасно, но результат всё равно может отличаться от ожидаемого. Если вызовы примитива выполняются из кода на C, они обращаются непосредственно к определению примитива на C, поэтому изменение определения символа на них не повлияет.

См. также defsubst, который определяет функцию подобно defun и указывает компилятору Lisp выполнять её встроенное раскрытие. См. Встроенные функции.

Чтобы отменить определение имени функции, используйте fmakunbound. См. Доступ к содержимому ячеек функций.

  • Поиск определений

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/Defining-Functions.html

Spec-Zone.ru

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