Function Clojure:使用持久列表生成包含Clojure中断的文件
我在这里问了一个相关的问题: 答案很好,但我意识到这并不是我所需要的。我简化了stackoverflow的例子,但我不仅仅写数据,我还试图写函数定义和其他包含列表的结构的东西。下面是一个简单的例子(从上一个问题中选择) 我想生成一个包含以下函数的文件: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,它就会以这种状态出现。这很好,但
(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]"