Компоненты символа
Каждый символ состоит из четырех компонентов (или «ячеек»), каждый из которых ссылается на другой объект:
- Печатное имя
-
Имя символа.
- Значение
-
Текущее значение символа как переменной.
- Функция
-
Определение функции символа. Здесь также могут храниться символ, карта клавиш или клавиатурный макрос.
- Список свойств
Список свойств символа.
В ячейке печатного имени всегда хранится строка, и ее нельзя изменить. В каждую из трех остальных ячеек можно поместить любой объект Lisp.
В ячейке печатного имени хранится строка, являющаяся именем символа. Поскольку символы представлены текстом с помощью имен, важно, чтобы не существовало двух символов с одинаковыми именами. Считыватель Lisp обеспечивает это: каждый раз, когда он считывает символ, он ищет существующий символ с указанным именем, прежде чем создать новый. Чтобы получить имя символа, используйте функцию symbol-name (см. Создание символов и добавление их в таблицу символов). Однако, хотя у каждого символа есть только одно уникальное печатное имя, на этот же символ можно ссылаться и по другим именам-алиасам, называемым «сокращениями» (см. Сокращения).
В ячейке значения хранится значение символа как переменной — именно его вы получите, если вычислите сам символ как выражение Lisp. Подробнее о присваивании и получении значений, в том числе об особенностях, таких как локальные привязки и правила видимости, см. в разделе Переменные. Большинство символов могут иметь в качестве значения любой объект Lisp, но значения некоторых специальных символов изменить нельзя; к ним относятся nil и t, а также любые символы, имена которых начинаются с ‘:’ (они называются ключевыми словами). См. раздел Переменные, которые никогда не меняются.
В ячейке функции хранится определение функции символа. Часто мы говорим «функция foo», подразумевая функцию, хранящуюся в ячейке функции символа foo; мы явно проводим это различие только тогда, когда это необходимо. Обычно ячейка функции используется для хранения функции (см. раздел Функции) или макроса (см. раздел Макросы). Однако в ней также могут храниться символ (см. раздел Перенаправление функции символа), клавиатурный макрос (см. раздел Клавиатурные макросы), карта клавиш (см. раздел Карты клавиш) или объект автозагрузки (см. раздел Автозагрузка). Чтобы получить содержимое ячейки функции символа, используйте функцию symbol-function (см. раздел Доступ к содержимому ячейки функции).
В ячейке списка свойств обычно должен храниться правильно сформированный список свойств. Чтобы получить список свойств символа, используйте функцию symbol-plist. См. раздел Свойства символов.
Ячейка значения может быть пустой, то есть не ссылаться ни на какой объект. (Это не то же самое, что хранить символ void, и не то же самое, что хранить символ nil.) Попытка получить значение из пустой ячейки приводит к ошибке, например ‘Значение символа как переменной не задано’.
Поскольку у каждого символа есть отдельные ячейки значения и функции, имена переменных и функций не конфликтуют. Например, символ buffer-file-name имеет значение (имя файла, открытого в текущем буфере), а также определение функции (примитивную функцию, возвращающую имя файла):
buffer-file-name
⇒ "/gnu/elisp/symbols.texi"
(symbol-function 'buffer-file-name)
⇒ #<subr buffer-file-name>
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/Symbol-Components.html