Clojure 将理解代码列表到txt文件

Clojure 将理解代码列表到txt文件,clojure,Clojure,如何将执行列表转储到txt文件 (for [ nr [1 2 3] letter [:a :b :c]] (str nr letter)); it generates what I need 当我将上述代码添加到(spit“test.txt”the_over_code)表单中时,我找到了惰性序列名(clojure.lang)。LazySeq@7d534269) 提前感谢您的提示/URL。 危险品 PS我正在更新最初的帖子。。。是否可以将生成的每个代码都写在不同的行上?以下操作完成: (s

如何将执行列表转储到txt文件

   (for [ nr [1 2 3] letter [:a :b :c]] (str nr letter)); it generates what I need
当我将上述代码添加到(spit“test.txt”the_over_code)表单中时,我找到了惰性序列名(clojure.lang)。LazySeq@7d534269)

提前感谢您的提示/URL。 危险品


PS我正在更新最初的帖子。。。是否可以将生成的每个代码都写在不同的行上?

以下操作完成:

(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
int到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"

下面是一个技巧:

(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
int到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"

您可以将表达式包装在
seq

(spit "test.txt"
    (seq (for [nr [1 2 3]
               letter [:a :b :c]]
           (str nr letter))))
要在单独的行上打印,只需
应用str
表达式即可。您可以在不同的行中获得数字/字母组合,但会丢失列表表示

(spit "test.txt"
  (apply str
    (for [nr [1 2 3]
          letter [:a :b :c]]
      (str nr letter "\n")))
我更喜欢这种方法,而不是不使用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")))
    ")"))

但是在这一点上,它变得非常丑陋,使用不带str的
看起来非常好。

您可以将表达式包装在
seq

(spit "test.txt"
    (seq (for [nr [1 2 3]
               letter [:a :b :c]]
           (str nr letter))))
要在单独的行上打印,只需
应用str
表达式即可。您可以在不同的行中获得数字/字母组合,但会丢失列表表示

(spit "test.txt"
  (apply str
    (for [nr [1 2 3]
          letter [:a :b :c]]
      (str nr letter "\n")))
我更喜欢这种方法,而不是不使用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")))
    ")"))

但是在这一点上,它变得非常丑陋,并且在没有str的情况下使用
看起来非常好。

谢谢你!是否可以将生成的每个代码写在不同的行上?谢谢!是否可以将生成的每个代码写在不同的行上?“这会将惰性序列转换为非惰性变体。”该位不正确。在惰性序列上调用
seq
将实现第一个元素/块,而不是全部。当然,然后打印它将实现其余的功能。这里发生的事情是LazySeq没有实现.toString,但是ASeq实现了。有趣。谢谢我在“seq”的文档中没有看到“lazy”,考虑到这种行为,我做了一个假设。哎呀!“这会将惰性序列转换为非惰性变体。”此位不正确。在惰性序列上调用
seq
将实现第一个元素/块,而不是全部。当然,然后打印它将实现其余的功能。这里发生的事情是LazySeq没有实现.toString,但是ASeq实现了。有趣。谢谢我在“seq”的文档中没有看到“lazy”,考虑到这种行为,我做了一个假设。哎呀!