2.4.4 符号类型

在 GNU Emcas Lisp 中,符号 (symbol) 是一个具名 (name) 对象。符号的名字就是符号的打印形式。在常规的 Lisp 实现中, 会有一个全局唯一的 obarray 来记录这些符号。在同一个 obarray 内,所有的符号都应当有自己唯一的名字。

符号可以作为变量,函数名使用,也可以用来指定一个属性列表。()在给定的语境下, 符号通常只有其中一个用途。不过, 你完全可以同时使用它的三种用途, 它们是相互独立的.

以 ':' 开头的符号称为关键字符号, 这些符号会自动的作为常量来使用。通常只在与位置符号的比较中使用。

符号的名字可以包含任何字符。大多数的符号名字由字母,数字,以及一些标点 '-+=*/'构成。这个样的名字不需要特殊的符号转义,只要它看起来不像数字。(如果很像数字, 那你需要在开头加上'\', 以强制解释器把它当成符号)。 字符 '_~!@$%^&:<>{}?' 很少使用,不过它们也不需要转义。其他的符号则需要反斜杠转义。不过与字符串中转义的方法不同,符号名称中的反斜杠只对紧挨其后的单个字符进行引号引用。举个例子,在字符串里 '\t' 表示一个制表符; 但在符号名称中, '\t' 只是表示被引号引起来的 't'. 如果你想在符号名中中键入制表符,那你需要真的按下制表符(前面加上 '\' 转义)。不过通常很少有人这么做。

Common Lisp note: 在 Common Lisp中, 所有的小写字母都会转换成大写字母, 除非它们被显示的转义. 但在 Emcas Lisp 中, 大写字母和小写字母本来就是独立的.

这里有几个例子。注意:第四个例子中的 '+' 被转义,不然这个表达式会被当成整数读取。在第六个例子中使用了很多标点,不过它们并不需要转义。

foo                 ; 一个名称为 ‘foo’ 的符号.
FOO                 ; 一个名称为 ‘FOO’ 的符号, 和上面那个 ‘foo’ 不同.
1+                  ; 一个名称为 ‘1+’ 的符号
                    ;   (不是 ‘+1’, '+1' 是个整数).
\+1                 ; 一个名称为 ‘+1’ 的符号
                    ;   (这个符号可读性不是很好).
\(*\ 1\ 2\)         ; 一个名称为 ‘(* 1 2)’ 的符号 (很糟糕的符号名).
+-*/_~!@$%^&=:<>{}  ; 一个名称为 ‘+-*/_~!@$%^&=:<>{}’ 的符号.
                    ;   这些符号不需要转义.

前面说过,符号的名字即为符号的打印表示,不过这里有一个例外。'##' 是一个特殊符号的打印表示,该符号被注册 (interned) 在 obarray 中,其名字为空的字符串。更进一步的说,'#:foo' 是一个未被注册 (uninterned) 在 obarray 中,且其名称为 foo 的符号的打印表示。 (正常情况下, Lisp 读取器会注册所有的符号, 详情查阅 创建符号章节)

译者注:这里 interned 被译为注册,uninterned即为未注册。

最后更新于