Common lisp 公共lisp符号中允许哪些字符?
公共lisp符号中允许哪些字符?你能给出一个正则表达式来匹配它们吗(或者它们是否超出了正则语法所能描述的范围) 我试图寻找有关这方面的信息,但我能找到的只是CLHS中的一些信息,但没有确切定义什么是法律符号 编辑: 因此,公共lisp符号可以合法地包含任何字符 然而,解析器在读取lisp代码时并不仅仅接受任何字符。可解析符号的规则是什么?例如,可以作为Common lisp 公共lisp符号中允许哪些字符?,common-lisp,Common Lisp,公共lisp符号中允许哪些字符?你能给出一个正则表达式来匹配它们吗(或者它们是否超出了正则语法所能描述的范围) 我试图寻找有关这方面的信息,但我能找到的只是CLHS中的一些信息,但没有确切定义什么是法律符号 编辑: 因此,公共lisp符号可以合法地包含任何字符 然而,解析器在读取lisp代码时并不仅仅接受任何字符。可解析符号的规则是什么?例如,可以作为'引用的符号或'内部(引用列表)提供的符号 我对从非lisp语言生成和读取非条形分隔符号感兴趣。对于我的应用程序来说,使用[a-zA-Z0-9:&
'引用的符号或'内部(引用列表)
提供的符号
我对从非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编写标记器和读取器,您可能会发现这是一种非常方便的方法。您几乎只需要识别哪些字符终止符号,哪些字符开始和结束列表,哪些字符被删除为空白,以及转义字符是什么。然后读取标记的嵌套列表,将每个标记转换为数字或符号(或字符串等)
也许是最简单的方法之一