5

首先,据我了解,变量标识符在普通 lisp 中称为符号。

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

所以,我想知道的是:Common Lisp 允许在符号中包含的完整字符集(或变量标识符,如果我错了)到底是什么?Scheme也一样吗?

另外,函数名称的字符集是否不同?

我一直在谷歌上搜索,在 CLHS 和 Practical Common Lisp 中查找,在我的一生中,一定有问题,因为我似乎找不到答案。

4

3 回答 3

8

详细的答案有点棘手。Common Lisp 有 ANSI 标准。它定义了可用字符集。基本上,您可以将所有这些定义的字符用作符号。另请参阅作为标记的符号

例如

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

是一个有效的符号。请注意,竖线标记符号,不属于符号名称。

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

LispWorks:

CL-USER 1 > (list 'δ 'ψ 'σ)
(δ ψ σ)
于 2012-07-27T07:52:34.963 回答
5

[从计划者的角度来看。尽管 Scheme 和 Common Lisp 中的某些概念具有相同的名称,但这并不意味着这两种语言中的含义相同。]

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

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

于 2012-07-27T08:25:52.280 回答
2

请参阅 CLHS 的第 2 章,其中详细描述了阅读器算法。但简单的答案是,如果一个标记不是一个 readmacro 调用(第 2.4 节),也不是一个数字或所有点,它默认被解释为一个符号。

于 2012-07-27T08:06:05.487 回答