Доступ к содержимому функциональных ячеек
Определение функции символа — это объект, хранящийся в функциональной ячейке символа. Описанные здесь функции обращаются к функциональным ячейкам символов, проверяют их и устанавливают их значения.
См. также функцию 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