【问题标题】:Clojure: generating files containing clojure breaks with persistent listsClojure:使用持久列表生成包含 clojure 中断的文件
【发布时间】:2012-03-05 09:55:11
【问题描述】:

我在这里问了一个相关问题:Clojure: How do I turn clojure code into a string that is evaluatable? It mostly works but lists are translated to raw parens, which fails

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

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

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

:update 之后的所有内容都是我在编写文件时可以访问的结构,因此我在其上调用 str 并以该状态出现。这很好,但是当我在这个生成的函数上加载文件时,列表会尝试将 3 作为函数调用(因为它是列表中的第一个元素)。

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

【问题讨论】:

  • 那么我是否必须遍历表单列表并将所有持久列表替换为引用的持久列表?如果是这样,我该怎么做?
  • 你能不能只引用地图,还是也需要评估? (defn aaa [] (fff :update '{:bbb "bbb" :xxx [1 2 3] :yyy (3 5 7)}))?如果这不起作用,您需要引用所有 seqs(如果是 (seq? x))。

标签: function file-io clojure eval


【解决方案1】:

将其封装在对 quote 的调用中,无需评估即可阅读。

【讨论】:

  • 交易是我想要评估它,一切正常,但列表!
【解决方案2】:

试试这个吧……

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

【讨论】:

    【解决方案3】:

    在获取字符串表示之前需要quote结构体:

    (list 'quote foo)
    

    foo 是结构。

    补充三点:

    1. 遍历代码以引用所有列表/序列根本不会这样做,因为顶级(defn ...) 表单也会被引用;

    2. 列表不是唯一可能有问题的类型——符号是另一种类型(+#<core$_PLUS_ clojure.core$_PLUS_@451ef443>);

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

    最后一点值得简短讨论。 pr 明确承诺如果 *print-readably*true,则生成可读表示,而 str 仅“偶然”(实现)为 Clojure 的复合数据结构生成这样的表示并且仍然仅当 @ 987654337@ 是true:

    (str ["asdf"])
    ; => "[\"asdf\"]"
    
    (binding [*print-readably* false]
      (str ["asdf"]))
    ; => "[asdf]"
    

    上述行为是由于clojure.lang.RT/printString(Clojure 的数据结构最终委托其toString 需要的方法)使用clojure.lang.RT/print 导致的,而clojure.lang.RT/print 又根据*print-readably* 的值选择输出格式.

    即使*print-readably* 绑定到truestr 也可能产生不适合clojure.lang.Reader 消耗的输出:例如(str "asdf") 只是 "asdf",而可读表示是 "\"asdf\""。使用(with-out-str (pr foo)) 获取包含foo 表示的字符串对象,如果*print-readably*true,则保证可读。

    【讨论】:

    • Marczyk,你是救生员。严重地。另外,我现在看到这一切都需要对读取/评估/打印的微妙之处进行一些研究,因为这是问题的核心!感谢您瞥见这个毛茸茸的世界。
    猜你喜欢
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    相关资源
    最近更新 更多