在for循环中重置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]]

我是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]]
    (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
也可以。