Roy*_*ado 4 lisp scheme common-lisp
首先,据我所知,变量标识符在常见的lisp中称为符号.
我注意到,在像C这样的语言中,变量标识符只能是alphanumberics和underscores,Common Lisp允许使用更多的字符,如"*"和(至少是scheme)"?"
所以,我想知道的是:Common Lisp允许在符号中使用的完整字符集是什么(如果我错了,可以使用变量标识符)?对于Scheme来说是一样的吗?
另外,函数名称的字符集是不同的?
我一直在谷歌搜索,查看CLHS,以及Practical Common Lisp,对于我的生活,有些事情一定是错的,因为我似乎无法找到答案.
详细的答案有点棘手.Common Lisp有ANSI标准.它定义了可用字符集.基本上,您可以将所有这些定义的字符用于符号.另请参见符号作为标记.
例如
|Polynom 2 * x ** 3 - 5 * x ** 2 + 10|
Run Code Online (Sandbox Code Playgroud)
是一个有效的符号.请注意,垂直条标记符号,不属于符号名称.
然后是Common Lisp的现有实现以及它们对各种字符集和字符串类型的支持.所以有几个支持Unicode(或类似)并允许符号名称中的Unicode字符.
LispWorks:
CL-USER 1 > (list '? '? '?)
(? ? ?)
Run Code Online (Sandbox Code Playgroud)
[从Schemer的角度来看。即使 Scheme 和 Common Lisp 中的某些概念具有相同的名称,但这并不意味着这两种语言中的含义相同。]
首先要注意符号和标识符是两个不同的东西。
符号可以被认为是支持快速相等比较的字符串。两个符号s和t如果拼写相同则相等(或多或少)。操作string=?需要遍历 中的字符,看它们是否都一样。这花费的时间与最短字符串的长度成正比。另一方面,符号会自动(在运行时系统中)放入(通常)哈希表中。因此symbol=?归结为一个简单的指针比较,因此非常快。符号通常用于 C 语言中使用枚举的情况。
符号是可以在运行时出现的值。
标识符只是程序中变量的名称。
现在,如果将所述程序表示为 Scheme 值,则一种选择是使用符号来表示标识符——但这并不意味着符号就是标识符(反之亦然)。标识符的更好表示(仍在 Scheme 中)是语法对象,它除了标识符的名称外,还记录了读取(或构造)标识符的位置。假设您遇到一个未定义的变量,并想用信号通知未定义的变量在程序中的位置,那么源位置是标识符表示的一部分是非常方便的。
最后但并非最不重要的。标识符的法律特征是什么?这里最好引用 R6RS 的章节和版本:
4.2.4 标识符
Scheme 也可以接受其他编程语言允许的大多数标识符。一般来说,字母、数字和“扩展字母字符”的序列是一个标识符,当它以不能开始表示数字对象的字符开头时。此外,+、- 和 ... 是标识符,以及以两个字符序列 -> 开头的字母、数字和扩展字母字符序列。以下是标识符的一些示例:
Run Code Online (Sandbox Code Playgroud)lambda q soup list->vector + V17a <= a34kTMNs ->- the-word-recursion-has-many-meanings可以在标识符中使用扩展字母字符,就好像它们是字母一样。以下是扩展字母字符:
Run Code Online (Sandbox Code Playgroud)! $ % & * + - . / : < = > ? @ ^ _ ~此外,所有 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