我有一些printlns需要从Clojure程序捕获,我想知道如何捕获输出?如何捕获clojure的标准输出?
我曾尝试:
(binding [a *out*]
(println "h")
a
)
:但这不起作用
我有一些printlns需要从Clojure程序捕获,我想知道如何捕获输出?如何捕获clojure的标准输出?
我曾尝试:
(binding [a *out*]
(println "h")
a
)
:但这不起作用
(with-out-str (println "this should return as a string"))
米歇尔的完全正确。因为我不能在他的回答评论添加代码,这里就是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*
,最后查询该临时写入器的字符串值。
只是为了扩大一点Michiel的答案,当你想捕获输出到一个文件,你可以结合与spit
。
当你不想在写出内存时在内存中建立一个巨大的字符串,那么你可以使用clojure.contrib.io
库中的with-out-writer
。
with-out-writer
是在执行其体内的代码,很好地概括在该文件的正确开启和文件资源的关闭和作家的结合*out*
宏。
来自优秀的http://clojuredocs.org/quickref/Clojure%20Core网站。 – 2011-03-29 11:33:37