Common lisp 公共lisp符号中允许哪些字符?

Common lisp 公共lisp符号中允许哪些字符?,common-lisp,Common Lisp,公共lisp符号中允许哪些字符?你能给出一个正则表达式来匹配它们吗(或者它们是否超出了正则语法所能描述的范围) 我试图寻找有关这方面的信息,但我能找到的只是CLHS中的一些信息,但没有确切定义什么是法律符号 编辑: 因此,公共lisp符号可以合法地包含任何字符 然而,解析器在读取lisp代码时并不仅仅接受任何字符。可解析符号的规则是什么?例如,可以作为'引用的符号或'内部(引用列表)提供的符号 我对从非lisp语言生成和读取非条形分隔符号感兴趣。对于我的应用程序来说,使用[a-zA-Z0-9:&

公共lisp符号中允许哪些字符?你能给出一个正则表达式来匹配它们吗(或者它们是否超出了正则语法所能描述的范围)

我试图寻找有关这方面的信息,但我能找到的只是CLHS中的一些信息,但没有确切定义什么是法律符号

编辑: 因此,公共lisp符号可以合法地包含任何字符

然而,解析器在读取lisp代码时并不仅仅接受任何字符。可解析符号的规则是什么?例如,可以作为
'引用的
符号或
'内部(引用列表)
提供的符号

我对从非lisp语言生成和读取非条形分隔符号感兴趣。对于我的应用程序来说,使用
[a-zA-Z0-9:&-]+
就足够了,但我倾向于尽可能精确,这就是为什么我试图确定是否存在可以匹配符号的正则表达式。匹配
|分隔语法|
将是一个额外的好处,但非分隔符号就足够了

这需要是使用
(读取)
时合法加载的符号。答案不是符号可以包含任何字符:

[1]> (read t)
#
*** - READ from #<IO TERMINAL-STREAM>: objects printed as # in view of *PRINT-LEVEL* cannot be read back in
[1]>(读t)
#
***-从#读取:在*打印级别*视图中打印为#的对象无法读回

我想知道这里什么是有效符号的规则或正则表达式,而不必用
|

分隔符号中的任何字符。例如:

(length (loop for i to char-code-limit
  collect (intern (string (code-char i)))))
==> 1114113

符号中可以包含任何字符。例如:

(length (loop for i to char-code-limit
  collect (intern (string (code-char i)))))
==> 1114113

如sds所述,符号名称可以包含任何字符。给定任何字符串,可以创建具有该名称的符号。然而,根据你的评论,听起来你想知道,在相当默认的设置下,什么会被解读为符号。答案仍然是“几乎任何东西”,只有少数例外

HyperSpec中的相关部分以开头,描述了标记化过程。它详细描述了流程,但最重要的部分可能是:

在处理令牌时,读取器的基本功能是 区分符号和数字的表示。当 如果令牌是累积的,则假定它代表一个数字 满足图2-9中所列数字的语法。如果没有 表示一个数字,如果它是 满足控制潜在数字语法的规则。如果 有效标记既不是数字的表示,也不是潜在的 数字,它代表一个符号

图2.9除第节所示外,第节所示为:

读取令牌时,它被解释为数字或符号。如果令牌满足下图中指定的数字语法,则将其解释为数字

所以,这个过程实际上是“标记流,对于每个标记,检查它是否是一个数字,如果它不是一个数字,那么它就是一个符号。”我意识到这并不能为符号提供一个干净的语法,但这只是语言定义的方式。如果您坐下来为Lisp编写标记器和读取器,您可能会发现这是一种非常方便的方法。您几乎只需要识别哪些字符终止符号,哪些字符开始和结束列表,哪些字符被删除为空白,以及转义字符是什么。然后读取标记的嵌套列表,将每个标记转换为数字或符号(或字符串等)

从标记化和数字检查的角度来看,最简单的方法之一就是Common Lisp有一个*read base*变量来控制基数。根据*read base*的值,有些东西是数字或符号,只有知道完整的令牌是什么以及运行时的当前状态,才能知道

CL-USER> 'beef
BEEF
CL-USER> (setf *read-base* 16)
16
CL-USER> 'beef
48879
CL-USER> (setf *read-base* a)   ; set it back to 10, which is now a
10
CL-USER> (setf *read-base* 36)
36
CL-USER> 'hello                 ; a number
29234652
CL-USER> 'hello\ world          ; a symbol
|HELLO WORLD|

如sds所述,符号名称可以包含任何字符。给定任何字符串,可以创建具有该名称的符号。然而,根据你的评论,听起来你想知道,在相当默认的设置下,什么会被解读为符号。答案仍然是“几乎任何东西”,只有少数例外

HyperSpec中的相关部分以开头,描述了标记化过程。它详细描述了流程,但最重要的部分可能是:

在处理令牌时,读取器的基本功能是 区分符号和数字的表示。当 如果令牌是累积的,则假定它代表一个数字 满足图2-9中所列数字的语法。如果没有 表示一个数字,如果它是 满足控制潜在数字语法的规则。如果 有效标记既不是数字的表示,也不是潜在的 数字,它代表一个符号

图2.9除第节所示外,第节所示为:

读取令牌时,它被解释为数字或符号。如果令牌满足下图中指定的数字语法,则将其解释为数字

所以,这个过程实际上是“标记流,对于每个标记,检查它是否是一个数字,如果它不是一个数字,那么它就是一个符号。”我意识到这并不能为符号提供一个干净的语法,但这只是语言定义的方式。如果您坐下来为Lisp编写标记器和读取器,您可能会发现这是一种非常方便的方法。您几乎只需要识别哪些字符终止符号,哪些字符开始和结束列表,哪些字符被删除为空白,以及转义字符是什么。然后读取标记的嵌套列表,将每个标记转换为数字或符号(或字符串等)

也许是最简单的方法之一