2012-07-27 36 views
4

首先,据我了解,变量标识符在通用lisp中被称为符号。lisp符号的有效字符

我注意到,虽然像C语言这样的语言变量标识符只能是字母数字和下划线,但Common Lisp允许使用更多字符,如“*”和(至少在方案中)“?”

所以,我想知道的是:Common Lisp允许在符号中包含的全部字符集(如果我错了,则为可变标识符)是什么?这是相同的计划?

此外,功能名称的字符集是不同的?

我一直在使用Google,在CLHS和Practical Common Lisp中寻找,而对于我的生活,一定是错误的,因为我似乎无法找到答案。

回答

7

详细的答案有点棘手。 Common Lisp有ANSI标准。它定义了一套available characters。基本上你可以使用所有这些定义的字符作为符号。另见Symbols as Tokens

例如

|Polynom 2 * x ** 3 - 5 * x ** 2 + 10| 

是一个有效符号。请注意,垂直条标记符号并且不属于符号名称。

然后是Common Lisp的现有实现以及它们对各种字符集和字符串类型的支持。所以有几个支持Unicode(或类似的)并允许符号名称中的Unicode字符。

LispWorks:所述CLHS,其详细描述了读出器算法的

CL-USER 1 > (list 'δ 'ψ 'σ) 
(δ ψ σ) 
+0

是否有一种方式来逃避'|'在你的口齿不清的例子吗? – William 2015-09-24 18:51:04

+0

@William:'| \ | |' – 2015-09-24 19:03:58

2

参见第2章。但简单的答案是,如果一个标记不是一个readmacro调用(2.4节),并且不是一个数字或所有点,它默认被解释为一个符号。

4

[从Schemer的角度来看。尽管Scheme和Common Lisp中的一些概念具有相同的名称,但这并不意味着这两种语言的意思是相同的。]

首先注意符号和标识符是两个不同的东西。

符号可以被认为是支持快速平等比较的字符串。 如果拼写方式相同,两个符号st相等(或多或少)。操作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