从with-out-str捕获“原始”返回值

时间:2011-08-22 16:51:48

标签: clojure

我正在使用with-out-str来捕获打印到stdout的一些数据。问题是with-out-str似乎抛弃了我函数的返回值。有什么方法可以捕捉到它们吗?我想吃蛋糕也吃。

示例:

(with-out-str (do (prn "test") (+ 1 1)))

1 个答案:

答案 0 :(得分:9)

Aping核心库的with-out-str宏的定义,您可以定义类似这样的宏:

(defmacro with-out-str-and-value
  [& body]
  `(let [s# (new java.io.StringWriter)]
     (binding [*out* s#]
       (let [v# ~@body]
         (vector (str s#)
                 v#)))))

没有the values function from Common Lisp及其multiple function return values,这里我们返回一个向量;第一项是从标准输出收集的文本,第二项是通过评估正文形式返回的值。