常见的lisp符号中允许使用哪些字符?

时间:2015-10-28 16:32:50

标签: common-lisp

常见的lisp符号中允许使用哪些字符?你能给出一个正则表达式来匹配它们(或者它们是否超出常规语法的能力来描述)?

我一直在尝试寻找有关此问题的信息,但我能找到的只有CLHS中的一些examples,但没有具体定义完全一个合法的符号。

编辑:

因此,常见的lisp符号可以合法地包含任何字符。

但是,解析器在读取lisp代码时不会接受任何字符。可解析符号的规则是什么?例如。可以'quoted符号或'(quoted lists)内部提供的符号。

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

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

[1]> (read t)
#
*** - READ from #<IO TERMINAL-STREAM>: objects printed as # in view of *PRINT-LEVEL* cannot be read back in

我想知道这里的有效符号的规则或正则表达式,而不用|分隔它。

2 个答案:

答案 0 :(得分:3)

如上所述,符号名称可以包含任何字符。给定任何字符串,您可以创建具有该名称的符号。但是,根据您的评论,听起来您会想知道在相当默认的设置下,什么会被视为符号。答案仍然是&#34;几乎任何事情&#34;,除了少数例外。

HyperSpec中的相关部分以2.2 Reader Algorithm开头,其中描述了标记化过程。它详细描述了这个过程,但也许最重要的部分是:

  

在处理令牌时,读者的基本功能是   区分符号表示与数字表示。当一个   如果累积了令牌,则假定它代表一个数字   满足图2-9中列出的数字的语法。如果没有   代表一个数字,然后假定它是一个潜在的数字   满足管理潜在数字语法的规则。如果一个   有效令牌既不是数字也不是潜在的表示   数字,它代表一个符号。

除了章节2.3.1 Numbers as Tokens之外,其中提到的图2.9,其中说:

  

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

因此,该过程实际上是对流进行标记化,并且对于每个标记,检查它是否为数字,如果它不是数字,则它是符号。 &#34;我意识到这并没有为符号提供一个很好的清晰语法,但这只是语言定义的方式。如果你坐下来为Lisp编写一个tokenizer和reader的任务,你可能会发现这是一种非常方便的方法。您几乎只需要识别哪些字符终止符号,哪些字符开始和结束列表,什么作为空格消除,以及您的转义字符是什么。然后,您将读取嵌套的标记列表,将每个标记转换为数字或符号(或字符串等)。

也许最常见的方法之一就是为什么你必须在标记化和检查数字方面做到这一点,这就是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|

答案 1 :(得分:1)

任何角色都可以在符号中。 E.g:

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