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

eri*_*kcw 7 clojure

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

例:

(with-out-str (do (prn "test") (+ 1 1)))
Run Code Online (Sandbox Code Playgroud)

seh*_*seh 9

如果定义了核心库的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#)))))
Run Code Online (Sandbox Code Playgroud)

如果没有Common Lisp values函数及其多函数返回值,这里我们返回一个向量; 第一项是从标准输出收集的文本,第二项是通过评估正文形式返回的值.