Function Clojure:使用持久列表生成包含Clojure中断的文件

Function Clojure:使用持久列表生成包含Clojure中断的文件,function,file-io,clojure,eval,Function,File Io,Clojure,Eval,我在这里问了一个相关的问题: 答案很好,但我意识到这并不是我所需要的。我简化了stackoverflow的例子,但我不仅仅写数据,我还试图写函数定义和其他包含列表的结构的东西。下面是一个简单的例子(从上一个问题中选择) 我想生成一个包含以下函数的文件: (defn aaa [] (fff :update {:bbb "bbb" :xxx [1 2 3] :yyy (3 5 7)})) 更新之后的所有内容都是我在编写文件时可以访问的结构,因此我对其调用str,它就会以这种状态出现。这很好,但

我在这里问了一个相关的问题:

答案很好,但我意识到这并不是我所需要的。我简化了stackoverflow的例子,但我不仅仅写数据,我还试图写函数定义和其他包含列表的结构的东西。下面是一个简单的例子(从上一个问题中选择)

我想生成一个包含以下函数的文件:

(defn aaa []
  (fff :update {:bbb "bbb" :xxx [1 2 3] :yyy (3 5 7)}))
更新之后的所有内容都是我在编写文件时可以访问的结构,因此我对其调用str,它就会以这种状态出现。这很好,但是当我在这个生成的函数上加载文件时,列表尝试将3作为函数调用(因为它是列表中的第一个元素)


所以我想要一个包含函数定义的文件,我可以调用load file并调用其中定义的函数。我怎样才能写出这个函数和相关的数据,这样我就可以重新加载它,而不用clojure认为以前的列表现在是函数调用了?

将它包装在调用
quote
中,这样就可以在不评估它的情况下读取它。

试试这个

(defn aaa []
  (fff :update {:bbb "bbb" :xxx [1 2 3] :yyy (list 3 5 7)}))

在获取字符串表示形式之前,您需要引用结构:

(list 'quote foo)
其中
foo
是结构

另外三点意见:

  • 遍历代码引用所有列表/序列根本不行,因为顶级
    (defn…
    表单也会被引用

  • 列表不是唯一可能出现问题的类型——符号是另一种类型(
    +

  • 您可能不想使用
    (str foo)
    (即使已经引用了
    foo
    ),而是想使用
    pr
    /
    prn
    打印出引用的
    foo
    ——或者更确切地说,打印出包含引用的
    foo
    的整个代码块

  • 最后一点值得简短讨论
    pr
    明确承诺,如果
    *可阅读地打印*
    true
    ,则生成可阅读的表示,而
    str
    仅“偶然”(实现)为Clojure的复合数据结构生成此类表示,并且仍然仅当
    *可阅读地打印*
    true
    时:

    上述行为是由于
    clojure.lang.RT/printString
    (这是clojure的数据结构最终将其
    委托给字符串
    所需的方法)使用
    clojure.lang.RT/print
    ,然后根据
    *可读取打印*
    的值选择输出格式


    即使将
    *可读打印*
    绑定到
    true
    str
    也可能产生不适合
    clojure.lang.Reader
    消费的输出:例如
    (str“asdf”)
    只是
    “asdf”
    ,而可读表示是
    “asdf\”
    。使用
    (不带str(pr foo))
    获取包含
    foo
    表示的字符串对象,如果
    *可读取打印*

    交易是我想评估它,一切正常,但列表除外!那么,我是否必须遍历表单列表并用引用的持久列表替换所有持久列表?如果是这样的话,我该怎么做呢?你能引用一下地图吗,还是需要对它进行评估<代码>(defn aaa[](fff:update'{:bbb“bbb”:xxx[1 2 3]:yyy(3 5 7)}))?如果这不起作用,你需要引用所有的
    seq
    s(如果
    (seq?x)
    )。Marczyk,你是救命恩人。认真地而且,我现在明白了,这一切都需要对阅读/评估/打印的微妙之处进行一些研究,因为这是问题的核心!谢谢你一瞥这个毛茸茸的世界。
    (str ["asdf"])
    ; => "[\"asdf\"]"
    
    (binding [*print-readably* false]
      (str ["asdf"]))
    ; => "[asdf]"