Spec-Zone.ru › Elisp

Доступ к содержимому функциональных ячеек

Определение функции символа — это объект, хранящийся в функциональной ячейке символа. Описанные здесь функции обращаются к функциональным ячейкам символов, проверяют их и устанавливают их значения.

См. также функцию indirect-function. См. Определение indirect-function.

Функция: symbol-function symbol

Эта функция возвращает объект из функциональной ячейки symbol. Она не проверяет, является ли возвращённый объект допустимой функцией. Если функция не определена, возвращаемое значение — nil.

(defun bar (n) (+ n 2))
(symbol-function 'bar)
     ⇒ #f(lambda (n) [t] (+ n 2))
(fset 'baz 'bar)
     ⇒ bar
(symbol-function 'baz)
     ⇒ bar

Если вы никогда не задавали символу определение функции, его функциональная ячейка содержит значение по умолчанию nil, и мы говорим, что эта функция не определена. Если попытаться вызвать символ как функцию, Emacs выдаст ошибку void-function.

В отличие от неопределённых переменных (см. Когда переменная не определена), функциональную ячейку символа, содержащую nil, невозможно отличить от функциональной ячейки неопределённой функции. Обратите внимание, что отсутствие определения — не то же самое, что символ void: void может быть допустимой функцией, если определить её с помощью defun.

Проверить, определена ли функция символа, можно с помощью fboundp. После того как символу задано определение функции, можно снова отменить его с помощью fmakunbound.

Функция: fboundp symbol

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

Функция: fmakunbound symbol

Эта функция присваивает функциональной ячейке symbol значение nil, поэтому последующая попытка обратиться к этой ячейке вызовет ошибку void-function. Функция возвращает symbol. (См. также makunbound в разделе Когда переменная не определена.)

(defun foo (x) x)
(foo 1)
     ⇒1
(fmakunbound 'foo)
     ⇒ foo
(foo 1)
error→ Symbol's function definition is void: foo
Функция: fset symbol definition

Эта функция сохраняет definition в функциональной ячейке symbol. Результатом является definition. Обычно definition должна быть функцией или именем функции, но эта проверка не выполняется. Аргумент symbol является обычным вычисляемым аргументом.

Основное назначение этой функции — использовать её как подпрограмму в конструкциях, определяющих или изменяющих функции, например defun или advice-add (см. Добавление советов к функциям Emacs Lisp). Её также можно использовать, чтобы задать символу определение, не являющееся функцией, например клавиатурный макрос (см. Клавиатурные макросы):

;; Define a named keyboard macro.
(fset 'kill-two-lines "\^u2\^k")
     ⇒ "\^u2\^k"

Если вы хотите использовать fset для создания альтернативного имени функции, рассмотрите возможность использовать вместо неё defalias. См. Определение defalias.

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

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/Function-Cells.html

Spec-Zone.ru

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