Определение функции символа — это объект, хранящийся в функциональной ячейке этого символа. Функции, описанные здесь, получают доступ, проверяют и устанавливают функциональную ячейку символов.
См. также функцию indirect-function. См. Определение indirect-function.
Эта функция возвращает объект в функциональной ячейке 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.
Эта функция возвращает t, если символ имеет не-nil объект в своей функциональной ячейке, и nil в противном случае. Она не проверяет, является ли объект действительной функцией.
Эта функция устанавливает функциональную ячейку symbol в nil, так что последующая попытка доступа к этой ячейке вызовет ошибку void-function. Она возвращает symbol. (См. также makunbound в Когда переменная пуста.)
(defun foo (x) x)
(foo 1)
⇒1
(fmakunbound 'foo)
⇒ foo
(foo 1) error→ Определение функции символа пусто: foo
Эта функция сохраняет 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.