【问题标题】:What is the idiomatic way to capture prints to *out* from a Clojure function?从 Clojure 函数中捕获打印到 *out* 的惯用方法是什么?
【发布时间】:2026-01-18 15:55:01
【问题描述】:

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

user> (prxml [:p "Test"])
<p>Test</p>nil

我更愿意这样做:

(def xml (capture-out (prxml [:p "Test"])))

我制作了 capture-out 功能,但我怀疑存在类似的东西,只是我在API 或邮件列表中找不到它。

【问题讨论】:

    标签: clojure stdout


    【解决方案1】:

    我刚刚从great blog post 中发现了 with-out-str,详细介绍了 Clojure 中的 XML 处理。

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

    (def xml (with-out-str (prxml [:p "Test"])))
    

    【讨论】:

      【解决方案2】:

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

      【讨论】: