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))

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

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

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

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

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

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

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

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

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

Для удаления определения функции используйте fmakunbound. См. Ячейки функций.

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

Spec-Zone.ru

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