如何转储到txt文件执行列表解析?
(for [ nr [1 2 3] letter [:a :b :c]] (str nr letter)); it generates what I need
当我将上述代码添加到(spit" test.txt" the_above_code)表单中时,我找到了Lazy序列名称(clojure.lang.LazySeq@7d534269)。
提前感谢您提示/网址。 DG
PS我正在更新初始帖子...是否可以在不同的行上编写每个生成的代码?
答案 0 :(得分:2)
以下是诀窍:
(spit "test.txt"
(with-out-str
(pr (for [nr [1 2 3] letter [:a :b :c]]
(str nr letter)))))
whith-out-str
允许您将任何打印到标准输出的字符串作为字符串,pr
打印以可读格式传递给它的任何内容(即它与read-string
函数一起使用)。通过这两者的组合,您可以获得写入文件的惰性序列的可读字符串表示。
修改强>
为了在不同的行中打印列表推导的每个元素,您必须prn
将其添加到stdout并使用doall
实现懒惰序列或者某些行那种。虽然如果您仅创建用于打印其元素的序列,那么doseq
更适合和惯用:
(spit "test.txt"
(with-out-str
(doseq [nr [1 2 3] letter [:a :b :c]]
(prn (str nr letter)))))
<强>的test.txt 强>
"1:a"
"1:b"
"1:c"
"2:a"
"2:b"
"2:c"
"3:a"
"3:b"
"3:c"
答案 1 :(得分:2)
您可以将表达式包装在seq
。
(spit "test.txt"
(seq (for [nr [1 2 3]
letter [:a :b :c]]
(str nr letter))))
要在单独的行上打印,只需apply str
表达式。您可以在不同的行上获得数字/字母组合,但是会丢失列表表示。
(spit "test.txt"
(apply str
(for [nr [1 2 3]
letter [:a :b :c]]
(str nr letter "\n")))
我更喜欢这种方法的with-out-str方法。如果出于某种原因,你想在字符串周围保留引号,你可以这样做:
(spit "test.txt"
(apply str
(for [nr [1 2 3]
letter [:a :b :c]]
(str "\"" nr letter "\"\n"))))
如果你想保持Clojure可读的数据结构,同时保持新行的可读性:
(spit "test.txt"
(str "("
(apply str
(for [nr [1 2 3]
letter [:a :b :c]]
(str "\"" nr letter "\"\n")))
")"))
但是在这一点上它变得非常丑陋,使用with-out-str
看起来非常好。