GNU Emacs Lisp 中的 symbol符号 是带有名称的对象。符号名称同时作为该符号的打印表示形式。在常规的 Lisp 使用场景中(仅使用一个符号表 obarray,see 创建与编入符号),符号的名称具有唯一性 —— 不存在两个名称相同的符号。
一个符号可作为变量、函数名使用,或用于存储属性列表;也可仅作为与其他所有 Lisp 对象相区分的标识,确保其在数据结构中的出现能被可靠识别。在特定上下文下,通常仅会用到上述一种用途,但你也可以独立地将同一个符号用于所有这些场景。
名称以冒号(‘:’)开头的符号称为 keyword symbol关键字符号。这类符号会自动充当常量,通常仅用于将未知符号与若干特定备选符号做比较。 See 永不改变的变量。
符号名称可包含任意字符。
Common Lisp 说明: 在 Common Lisp 中,小写字母会自动转换为大写(除非显式转义);而在 Emacs Lisp 中,大小写字母是完全不同的字符。
以下是多个符号名称示例。注意第四个示例中的 ‘+’ 需转义,避免被解析为数字;第六个示例则无需转义,因为名称的其余部分使其无法被识别为数字。
foo ; 符号名称为 ‘foo’ FOO ; 符号名称为 ‘FOO’,与 ‘foo’ 不同
1+ ; 符号名称为 ‘1+’ ; (而非 ‘+1’ — 后者是整数)。
\+1 ; 符号名称为 ‘+1’ ; (可读性较差)。
\(*\ 1\ 2\) ; 符号名称为 ‘(* 1 2)’ (更差的名称)。 +-*/_~!@$%^&=:<>{} ; 符号名称为 ‘+-*/_~!@$%^&=:<>{}’. ; 这些字符无需转义。
符号名称作为其打印表示形式的规则有两个例外: