2.4.4 Тип символа

Символ в GNU Emacs Lisp — это объект с именем. Имя символа служит печатным представлением символа. В обычном использовании Lisp, с одним единственным obarray (см. Создание и интернирование символов), имя символа уникально — у двух символов не может быть одинакового имени.

Символ может служить переменной, именем функции или хранить список свойств. Или он может служить только для того, чтобы отличаться от всех других объектов Lisp, так что его присутствие в структуре данных может быть надежно распознано. В данном контексте обычно предполагается только одно из этих применений. Но вы можете использовать один и тот же символ во всех этих способах независимо.

Символ, чье имя начинается с двоеточия («:»), называется ключевым символом. Эти символы автоматически действуют как константы и обычно используются только для сравнения неизвестного символа с несколькими конкретными альтернативами. См. Переменные, которые никогда не меняются.

Имя символа может содержать любые символы. Большинство имен символов пишутся с использованием букв, цифр и знаков препинания «-+=*/». Такие имена не требуют специальной пунктуации; символы имени достаточны, если только имя не выглядит как число. (Если оно выглядит как число, напишите «\» в начале имени, чтобы принудительно интерпретировать его как символ.) Символы «_~!@$%^&:<>{}?» используются реже, но также не требуют специальной пунктуации. Любые другие символы могут быть включены в имя символа, экранируя их обратным слешем. В отличие от использования в строках, однако, обратный слеш в имени символа просто заключает в кавычки один символ, следующий за обратным слешем. Например, в строке «\t» представляет символ табуляции; в имени символа, однако, «\t» просто заключает в кавычки букву «t». Чтобы иметь символ с символом табуляции в своем имени, вы должны фактически использовать табуляцию (предшествуя ее обратным слешем). Но это редкость.

Примечание Common Lisp: В Common Lisp строчные буквы всегда преобразуются в верхний регистр, если они явно не экранированы. В Emacs Lisp верхний и нижний регистр букв различаются.

Вот несколько примеров имен символов. Обратите внимание, что «+» в четвертом примере экранирован, чтобы предотвратить его чтение как числа. Это не обязательно в шестом примере, потому что остальная часть имени делает его недействительным как число.

foo                 ; Символ с именем «foo».
FOO                 ; Символ с именем «FOO», отличный от «foo».
1+                  ; Символ с именем «1+».
                    ;   (не «+1», который является целым числом).
\+1                 ; Символ с именем «+1».
                    ;   (не очень читаемое имя).
\(*\ 1\ 2\)         ; Символ с именем «(* 1 2)» (худшее имя).
+-*/_~!@$%^&=:<>{}  ; Символ с именем «+-*/_~!@$%^&=:<>{}».
                    ;   Эти символы не обязательно нужно экранировать.

В качестве исключения из правила о том, что имя символа служит его печатным представлением, «##» является печатным представлением интернированного символа, чье имя — пустая строка. Кроме того, «#:foo» является печатным представлением неинтернированного символа, чье имя — foo. (Обычно Lisp-ридер интернирует все символы; см. Создание и интернирование символов.)