首先,据我所知,变量标识符在常见的lisp中称为符号。
我注意到,在像C这样的语言中,变量标识符只能是alphanumberics和下划线,Common Lisp允许使用更多的字符,如“*”和(至少是scheme)“?”
所以,我想知道的是:Common Lisp允许在符号中使用的完整字符集(或者如果我错了则是变量标识符)?对于Scheme来说是一样的吗?
另外,函数名称的字符集是否不同?
我一直在谷歌搜索,查看CLHS,以及Practical Common Lisp,对于我的生活,有些事情一定是错的,因为我似乎无法找到答案。
答案 0 :(得分:8)
详细的答案有点棘手。 Common Lisp有ANSI标准。它定义了available characters的集合。基本上,您可以将所有这些定义的字符用于符号。另请参阅Symbols as Tokens。
例如
|Polynom 2 * x ** 3 - 5 * x ** 2 + 10|
是有效的符号。请注意,垂直条标记符号,不属于符号名称。
然后是Common Lisp的现有实现以及它们对各种字符集和字符串类型的支持。所以有几个支持Unicode(或类似),并允许符号名称中的Unicode字符。
LispWorks:
CL-USER 1 > (list 'δ 'ψ 'σ)
(δ ψ σ)
答案 1 :(得分:4)
[从Schemer的角度来看。尽管Scheme和Common Lisp中的一些概念具有相同的名称,但并不意味着两种语言中的含义相同。]
首先请注意,符号和标识符是两个不同的东西。
符号可以被认为是支持快速相等比较的字符串。
如果拼写方式相同,则s
和t
两个符号相等(或多或少)。操作string=?
需要遍历中的字符并查看它们是否完全相同。这需要时间与最短字符串的长度成比例。另一方面,符号自动(运行时系统)放入(通常)哈希表中。因此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可以在标识符中使用。此外,当通过指定时,可以在标识符内使用任何字符。例如,标识符H \ x65; 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
答案 2 :(得分:2)
参见CLHS的第2章,其中详细描述了阅读器算法。但简单的答案是,如果令牌不是readmacro调用(第2.4节),并且不是数字或全部点,则默认为被解释为符号。