9.1 Компоненты символов

Каждый символ имеет четыре компонента (или «ячейки»), каждый из которых ссылается на другой объект:

Имя для вывода

Имя символа.

Значение

Текущее значение символа как переменной.

Функция

Определение функции символа. Оно также может содержать символ, карту клавиш или макрос клавиатуры.

Список свойств

Список свойств символа.

Ячейка имени для вывода всегда содержит строку и не может быть изменена. Каждая из других трех ячеек может быть установлена в любой объект Lisp.

Ячейка имени для вывода содержит строку, которая является именем символа. Поскольку символы представляются текстово по их именам, важно не иметь двух символов с одинаковым именем. Читатель Lisp обеспечивает это: каждый раз, когда он считывает символ, он ищет существующий символ с указанным именем, прежде чем создавать новый. Чтобы получить имя символа, используйте функцию symbol-name (см. Создание и интернирование символов). Однако, хотя каждый символ имеет только одно уникальное имя для вывода, возможно обращаться к этому же символу через разные псевдонимные имена, называемые «сокращениями» (см. Сокращения).

Ячейка значения содержит значение символа как переменной, то есть то, что вы получите, если сам символ будет вычислен как выражение Lisp. См. Переменные, для получения подробной информации о том, как устанавливаются и извлекаются значения, включая такие осложнения, как локальные привязки и правила области видимости. Большинство символов могут иметь в качестве значения любой объект Lisp, но некоторые специальные символы имеют значения, которые нельзя изменить; к ним относятся nil и t, а также любой символ, имя которого начинается с «:» (такие называются ключевые слова). См. Переменные, которые никогда не меняются.

Ячейка функции содержит определение функции символа. Часто мы говорим о «функции foo», когда на самом деле имеем в виду функцию, хранящуюся в ячейке функции foo; мы делаем это различие явным только тогда, когда это необходимо. Обычно ячейка функции используется для хранения функции (см. Функции) или макроса (см. Макросы). Однако ее также можно использовать для хранения символа (см. Непрямое обращение к функции символа), макроса клавиатуры (см. Макросы клавиатуры), карты клавиш (см. Карты клавиш) или объекта автозагрузки (см. Автозагрузка). Чтобы получить содержимое ячейки функции символа, используйте функцию symbol-function (см. Доступ к содержимому ячейки функции).

Ячейка списка свойств обычно должна содержать правильно отформатированный список свойств. Чтобы получить список свойств символа, используйте функцию symbol-plist. См. Свойства символов.

Ячейка значения может быть void, что означает, что ячейка не ссылается ни на один объект. (Это не то же самое, что хранить символ void, и не то же самое, что хранить символ nil.) Попытка осмотреть ячейку значения, которая является void, приведет к ошибке, например, «Значение символа как переменной пусто».

Поскольку каждый символ имеет отдельные ячейки значения и функции, имена переменных и функций не конфликтуют. Например, символ buffer-file-name имеет значение (имя файла, который просматривается в текущем буфере), а также определение функции (примитивная функция, возвращающая имя файла):

buffer-file-name
     ⇒ "/gnu/elisp/symbols.texi"
(symbol-function 'buffer-file-name)
     ⇒ #<subr buffer-file-name>