9.2 Определение символов

Определение — это особый вид выражения Lisp, которое объявляет о вашем намерении использовать символ определённым образом. Обычно оно задаёт значение или смысл символа для одного вида использования, а также документацию для его значения при использовании таким образом. Таким образом, когда вы определяете символ как переменную, вы можете указать начальное значение для переменной и документацию для неё.

defvar и defconst — это специальные формы, которые определяют символ как глобальную переменную — переменную, доступ к которой возможен в любой точке программы на Lisp. См. Переменные для подробностей о переменных. Чтобы определить настраиваемую переменную, используйте макрос defcustom, который также вызывает defvar как подпрограмму (см. Настройки параметров).

В принципе, вы можете присвоить значение переменной любому символу с помощью setq, независимо от того, был ли он предварительно определён как переменная. Однако вам следует писать определение переменной для каждой глобальной переменной, которую вы собираетесь использовать; в противном случае ваша программа на Lisp может работать неправильно, если она выполняется с включённой лексической областью видимости (см. Правила области видимости для привязок переменных).

defun определяет символ как функцию, создавая лямбда-выражение и сохраняя его в функциональной ячейке символа. Это лямбда-выражение становится определением функции для данного символа. (Термин «определение функции», означающий содержимое функциональной ячейки, происходит из идеи, что defun даёт символу его определение как функции.) defsubst и defalias — это два других способа определения функции. См. Функции.

defmacro определяет символ как макрос. Он создаёт объект-макрос и сохраняет его в функциональной ячейке символа. Обратите внимание, что данный символ может быть макросом или функцией, но не тем и другим одновременно, поскольку и определение макроса, и определение функции хранятся в функциональной ячейке, а эта ячейка в любой момент времени может содержать только один объект Lisp. См. Макросы.

Как уже отмечалось, Emacs Lisp позволяет одному и тому же символу быть определённым и как переменная (например, с помощью defvar), и как функция или макрос (например, с помощью defun). Такие определения не конфликтуют.

Эти определения также служат ориентирами для инструментов программирования. Например, команды C-h f и C-h v создают справочные буферы, содержащие ссылки на соответствующие определения переменных, функций или макросов. См. Справка по именам в Руководстве GNU Emacs.