[从计划者的角度来看。尽管 Scheme 和 Common Lisp 中的某些概念具有相同的名称,但这并不意味着这两种语言中的含义相同。]
首先请注意,符号和标识符是两个不同的东西。
符号可以被认为是支持快速相等比较的字符串。如果拼写相同,两个符号s
和t
相等(或多或少)。该操作string=?
需要遍历 the 中的字符并查看它们是否都相似。这花费的时间与最短字符串的长度成正比。另一方面,符号会自动(在运行时系统中)放入(通常)哈希表中。因此symbol=?
归结为简单的指针比较,因此非常快。符号通常用于 C 语言中使用枚举的情况。
符号是可以在运行时出现的值。
标识符只是程序中变量的名称。
现在,如果要将所述程序表示为 Scheme 值,则一种选择是使用符号来表示标识符 - 但这并不意味着符号是标识符(反之亦然)。标识符的更好表示(仍在 Scheme 中)是语法对象,除了标识符的名称之外,它还记录了读取(或构造)标识符的位置。假设您遇到一个未定义的变量,并想指示未定义变量在程序中的位置,那么源位置是标识符表示的一部分非常方便。
最后但并非最不重要的。标识符的法律特征是什么?这里最好引用 R6RS 的章节和版本:
4.2.4 标识符
其他编程语言允许的大多数标识符也是 Scheme 可接受的。通常,字母、数字和“扩展字母字符”序列是一个标识符,当它以一个不能开始表示数字对象的字符开始时。此外,+、- 和 ... 是标识符,以两个字符序列 -> 开头的字母、数字和扩展字母字符序列也是标识符。以下是标识符的一些示例:
lambda q soup
list->vector + V17a
<= a34kTMNs ->-
the-word-recursion-has-many-meanings
扩展的字母字符可以在标识符中使用,就好像它们是字母一样。以下是扩展的字母字符:
! $ % & * + - . / : < = > ? @ ^ _ ~
此外,所有 Unicode 标量值大于 127 且 Unicode 类别为 Lu、Ll、Lt、Lm、Lo、Mn、Mc、Me、Nd、Nl、No、Pd、Pc、Po、Sc、Sm、Sk 的字符、So 或 Co 可以在标识符中使用。此外,当通过 <inline hex escape> 指定时,可以在标识符中使用任何字符。例如,标识符与标识符H\x65;llo
相同,标识符
Hello
与标识符\x3BB;
相同
λ
。
任何标识符都可以在 Scheme 程序中用作变量或语法关键字(参见 5.2 和 9.2 节)。任何标识符也可以用作句法数据,在这种情况下,它代表一个
符号(参见第 11.10 节)。
来自:http ://www.r6rs.org/final/html/r6rs/r6rs-ZH-7.html#node_sec_4.2.4