从Clojure函数中捕获打印到*out*的惯用方法是什么?

Rob*_*ell 5 stdout clojure

例如,prxml函数将XML打印到*out*.我想将此输出捕获为String.以下是REPL的典型用法:

user> (prxml [:p "Test"])
<p>Test</p>nil
Run Code Online (Sandbox Code Playgroud)

我反而喜欢这样做:

(def xml (capture-out (prxml [:p "Test"])))
Run Code Online (Sandbox Code Playgroud)

我编写了捕获功能,但我怀疑它存在,只有我在API或邮件列表中找不到它.

Rob*_*ell 6

我刚刚发现与出-STR从这个巨大的博客文章中详细介绍的Clojure的XML处理.

所以我的例子的正确实现是:

(def xml (with-out-str (prxml [:p "Test"])))
Run Code Online (Sandbox Code Playgroud)


小智 6

更一般地说,如果您查看源代码,with-out-str您可以看到如何使用动态绑定*out*到任何流binding.这适用于动态设置任何现有var的值.