1

我应该阅读一个复杂的 s 表达式树,修改一些节点并将其保存在某处。

看来,在处理过程中,“读取”功能正在“修改”输入。例如在一个简单的例子中:

CL-USER> (read-from-string "(seq_num 123)")
(SEQ_NUM 123)
13

您可以看到它大写节点(以及值)。

同样,它似乎可以在值的最左边和最右边添加管道。如:

CL-USER> (read-from-string "(password 000006013H)")
(PASSWORD |000006013H|)
21

它增加了管道!

有没有办法告诉'阅读不要那样做?我想当 s 表达式实际上是一个有效的 LISP 程序时,这种修改是有充分理由的。但这里不是这样。让我们将该文件视为 XML 文件。一个看似 s-expr 的简单配置文件。我不需要他“实习”它读取的符号。我只需要他将其反序列化为一棵树,因为对我来说这是搜索树的最简单方法('car 和 'cdr 不好)。

好吧,如果树已形成,那么每个符号都必须被实习。换句话说,我怎么能告诉他不实习任何符号,而是将其保留为字符串。(因此它可以形成 cons-tree,但不是指向符号,而是指向字符串。你明白我的意思吗?)

4

1 回答 1

4

默认情况下,阅读器将内部化符号。请注意,阅读器和打印机都会影响符号的使用和显示方式。如果您想查看符号调用的真实情况(symbol-name some-symbol)。如有必要,打印机将尝试转义符号,以便可以回读并使用相同的大小写。

CL-USER 26 > 'foo
FOO

CL-USER 27 > 'f\oo
|FoO|

CL-USER 28 > (symbol-name 'f\oo)
"FoO"

阅读器允许控制符号的读取方式。见下文。

有几件事要知道:

  • 默认情况下,所有符号在内部都是大写的。默认情况下,阅读器大写小写字符。

  • 符号可以包含任意字符,包括小写字符。然后该符号需要使用转义:

例子:

|This is a valid symbol.|

并不是说竖线不是符号名称的一部分。它们用于转义符号。另一个转义字符是反斜杠:

1\a2

上面也是一个符号。

  • 请注意,包含数字或字符的事物也可以是符号或数字,具体取决于读取基数:

例子:

00a

以上是阅读器底座 10 中的符号。

相同的示例,其他读取基础:

00a

上面是读者基数 16 中的一个数字。

  • 一个非实习符号(不在包中)是这样写的:

例子:

#:non-interned-symbol
  • 关键字符号:

例子:

:keyword-symbol

您如何影响在读取过程中创建/查找符号的情况?

  • 您可以转义符号,见上文

  • 使用具有不同大小写的可读表。

Common Lisp Hyperspec 中的示例:23.1.2.1 Readtable 案例对 Lisp Reader 的影响示例

关闭打印机中的转义

CL-USER 36 > (let ((*print-escape* nil))
               (write (read-from-string "(|passWord| 000006013H)")))
(passWord 000006013H)
...
于 2013-05-13T15:34:59.273 回答