13.3 Присвоение имени функции

Символ может служить именем функции. Это происходит, когда функциональная ячейка символа (см. Компоненты символа) содержит объект функции (например, лямбда-выражение). Тогда сам символ становится допустимой вызываемой функцией, эквивалентной объекту функции в своей функциональной ячейке.

Содержимое функциональной ячейки также называется определением функции символа. Процедура использования определения функции символа вместо самого символа называется косвенной адресацией функции символа; см. Косвенная адресация функции символа. Если вы не задали символу определение функции, его функциональная ячейка считается пустой, и он не может использоваться как функция.

На практике почти все функции имеют имена и на них ссылаются по их именам. Вы можете создать именованную функцию Lisp, определив лямбда-выражение и поместив его в функциональную ячейку (см. Доступ к содержимому функциональной ячейки). Однако чаще используется макрос defun, описанный в следующем разделе. См. Определение функций.

Мы даём функциям имена, потому что на них удобно ссылаться по их именам в выражениях Lisp. Кроме того, именованная функция Lisp может легко ссылаться на саму себя — она может быть рекурсивной. Более того, на примитивы можно ссылаться текстуально только по их именам, поскольку объекты примитивных функций (см. Тип примитивной функции) не имеют синтаксиса для чтения.

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

Обратите внимание, что символ, используемый как имя функции, также может использоваться как переменная; эти два применения символа независимы и не конфликтуют. (Это не так в некоторых диалектах Lisp, например, в Scheme.)

По соглашению, если символ функции состоит из двух имён, разделённых «--», то функция предназначена для внутреннего использования, и первая часть указывает файл, определяющий функцию. Например, функция с именем vc-git--rev-parse является внутренней функцией, определённой в vc-git.el. Внутренние функции, написанные на C, имеют имена, оканчивающиеся на «-internal», например, bury-buffer-internal. Код Emacs, добавленный до 2018 года, может использовать другие соглашения об именовании для внутреннего использования, которые постепенно выводятся из обихода.