列表理解代码到txt文件

时间:2014-04-14 18:40:21

标签: clojure

如何转储到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我正在更新初始帖子...是否可以在不同的行上编写每个生成的代码?

2 个答案:

答案 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看起来非常好。