我有一些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