【问题标题】:How can I unserialize a s-exp then seralize it and avoid upper-casing?如何反序列化 s-exp 然后对其进行序列化并避免大写?
【发布时间】:2013-05-13 14:59:31
【问题描述】:

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

在处理过程中,'read 函数似乎正在“修改”输入。举个简单的例子:

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

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

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

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

它添加了管道!

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

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

【问题讨论】:

    标签: lisp common-lisp s-expression


    【解决方案1】:

    默认情况下,阅读器将内化符号。请注意,阅读器和打印机都会影响符号的使用和显示方式。如果您想查看符号调用(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 Examples of Effect of Readtable Case on the Lisp Reader

    在打印机中关闭转义

    CL-USER 36 > (let ((*print-escape* nil))
                   (write (read-from-string "(|passWord| 000006013H)")))
    (passWord 000006013H)
    ...
    

    【讨论】:

    • 好的接受。 readtable-case 实际上是我需要的。测试了它除了管道部分之外都可以工作,但我想我知道我将如何处理它!
    • @yves Baumes:竖线(“管道”)不是符号的一部分。它们是转义字符。您可以告诉打印机不要转义符号。查看我的编辑。
    猜你喜欢
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-09
    相关资源
    最近更新 更多