[从Schemer的角度来看。尽管Scheme和Common Lisp中的一些概念具有相同的名称,但这并不意味着这两种语言的意思是相同的。]
首先注意符号和标识符是两个不同的东西。
符号可以被认为是支持快速平等比较的字符串。 如果拼写方式相同,两个符号s
和t
相等(或多或少)。操作string=?
需要循环查看这些字符,看看它们是否完全相同。这需要与最短字符串的长度成比例的时间。另一方面,符号自动(运行时系统)放入(通常)散列表中。因此symbol=?
归结为一个简单的指针比较,因此非常快。在C中使用枚举的情况下经常使用符号。
符号是可以在运行时出现的值。
标识符只是程序中变量的名称。
现在,如果将所述程序表示为Scheme值,则一种选择是使用符号来表示标识符 - 但这并不意味着符号是标识符(反之亦然)。更好地表示标识符(仍在Scheme中)是语法对象,除标识符的名称外,它还记录标识符被读取(或构造)的位置。假设你遇到一个未定义的变量并且想要在程序中的未定义变量的位置发信号,那么源位置是标识符表示的一部分非常方便。
最后但并非最不重要。一个标识符的法律特征是什么?这是最好从R6RS引用章节和版本:
4.2.4标识符
其他编程语言允许大多数标识符也是可以接受的方案。通常,字母,数字和“扩展字母字符”的序列是一个标识符,当它以无法开始数字对象表示的字符开头时。另外,+, - 和...是标识符,也是以两个字符序列 - >开头的字母,数字和扩展字母字符序列。这里是标识符的一些例子:
lambda q soup
list->vector + V17a
<= a34kTMNs ->-
the-word-recursion-has-many-meanings
扩展的字母可能标识符范围内,如果他们的信件被使用。以下是扩展字母字符:
! $ % & * + - ./: <=> ? @^_ ~
此外,其Unicode标值是所有字符大于127并且其Unicode的类别是路中,L1,LT,LM,螺,锰,MC,Me中,钕,NL ,否,Pd,Pc,Po,Sc,Sm,Sk,So或Co可以在标识符内使用。另外,任何字符都可以在标识符中使用,当通过一个指定的。例如,标识符H \ llo与标识符Hello相同,标识符\ x3BB;与标识符λ相同。
在Scheme程序中,任何标识符都可以用作变量或语法关键字(请参阅5.2节和9.2节)。任何标识符也可以用作一个语法数据,在这种情况下它代表一个符号(见11.10节)。
来源:http://www.r6rs.org/final/html/r6rs/r6rs-Z-H-7.html#node_sec_4.2.4
是否有一种方式来逃避'|'在你的口齿不清的例子吗? – William 2015-09-24 18:51:04
@William:'| \ | |' – 2015-09-24 19:03:58