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

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

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

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

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

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

Если вы никогда не присваивали символу никакого определения функции, его функциональная ячейка содержит значение по умолчанию nil, и мы говорим, что эта функция пуста (void). Если вы попытаетесь вызвать символ как функцию, 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→ Определение функции символа пусто: foo
Функция: fset symbol definition

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

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

;; Определите именованный клавиатурный макрос.
(fset 'kill-two-lines "\^u2\^k")
     ⇒ "\^u2\^k"

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

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