在for循环中重置Clojure输出绑定
我是Clojure新手,正在尝试通过重新绑定在for循环中重置Clojure输出绑定,clojure,leiningen,Clojure,Leiningen,我是Clojure新手,正在尝试通过重新绑定*out*将输出重定向到文件。在一个简单的情况下,它可以很好地工作: (binding [*out* (new java.io.FileWriter "test.txt")] (println "Hi")) 这就是我所期望的,将“Hi”打印到test.txt文件。但是,如果我为循环引入一个,事情就会出错: (binding [*out* (new java.io.FileWriter "test.txt")] (for [x [1 2]]
*out*
将输出重定向到文件。在一个简单的情况下,它可以很好地工作:
(binding [*out* (new java.io.FileWriter "test.txt")]
(println "Hi"))
这就是我所期望的,将“Hi”打印到test.txt文件。但是,如果我为循环引入一个,事情就会出错:
(binding [*out* (new java.io.FileWriter "test.txt")]
(for [x [1 2]]
(println "Hi" x)))
这一次,所有的输出都转到标准输出,文件是空的。这是怎么回事
我正在使用Leiningen,如果这有什么不同的话:
Leiningen 2.0.0 on Java 1.7.0_13 Java HotSpot(TM) 64-Bit Server VM
你被懒虫咬了
将doall
或dorun
放在for周围和绑定内
(binding [*out* (new java.io.FileWriter "test.txt")]
(doall (for [x [1 2]]
(println "Hi" x))))
在您的示例中,正在进行打印,然后在从绑定返回结果后,由repl打印结果。因此,在印刷时,装订不再到位
不会打印任何内容,因为结果是一个延迟序列,稍后使用时将对其进行计算
user> (def result (binding [*out* (new java.io.FileWriter "test.txt")]
(for [x [1 2]]
(println "Hi" x))))
#'user/result
当repl打印结果时,将对printlns进行评估:
user> result
(Hi 1
Hi 2
nil nil)
如果我们在绑定中强制计算为
返回的惰性序列
没有任何内容打印到repl
user> (def result (binding [*out* (new java.io.FileWriter "test.txt")]
(doall (for [x [1 2]]
(println "Hi" x)))))
#'user/result
user> result
(nil nil)
相反,输出结果会出现在文件中:
arthur@a:~/hello$ cat test.txt
Hi 1
Hi 2
我很抱歉。我删除了这条评论,因为我知道它行不通。最初的评论是:(doseq[x[12]](println“Hi”x))
@Kyle实际上,它确实有效。你应该更自信:)所以这一定是一个懒惰的事情。。。希望你能有更多的见解。很酷,谢谢你的澄清。同样值得注意的是,用doseq
替换for
也可以。