我需要从Clojure程序中捕获一些printlns,我想知道如何捕获输出?
我试过了:
(binding [a *out*]
(println "h")
a
)
:但这不起作用
答案 0 :(得分:33)
(with-out-str (println "this should return as a string"))
答案 1 :(得分:7)
为了扩展Michiel的答案,当您想要将输出捕获到文件时,可以将with-out-str
与spit
结合使用。
如果您不希望在写出来之前在内存中构建一个巨大的字符串,那么您可以使用with-out-writer
库中的clojure.contrib.io
。
with-out-writer
是一个宏,可以很好地封装文件资源的正确打开和关闭,并在执行代码时将该文件上的编写器绑定到*out*
。
答案 2 :(得分:3)
Michiel完全正确。由于我无法在评论的答案中添加代码,因此with-out-str
涵盖的内容如此,您可以将其与您的尝试进行比较:
user=> (macroexpand-1 '(with-out-str (println "output")))
(clojure.core/let [s__4091__auto__ (new java.io.StringWriter)]
(clojure.core/binding [clojure.core/*out* s__4091__auto__]
(println "output")
(clojure.core/str s__4091__auto__)))
您的代码将现有的标准输出流绑定到变量,打印到该流,然后通过变量询问流的值;但是,流的值当然不是打印到它的字节数。因此with-out-str
暂时将新创建的StringWriter
绑定到*out*
,最后查询该临时写入者的字符串值。