2011-08-22 15 views
6

Estoy usando with-out-str para capturar algunos datos impresos en stdout. El problema es que with-out-str parece descartar el valor de retorno de mi función. ¿Hay alguna manera de que pueda capturar ambos? Me gustaría tener mi pastel y comerlo también.Capturando el valor de retorno "original" de with-out-str

Ejemplo:

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

¿A qué valor de retorno se refiere? El '2' volvió de evaluar' (+ 1 1) '? – seh

Respuesta

8

Imitando la definición de la biblioteca central with-out-str macro, se podría definir una similar como esto:

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

Sin the values function from Common Lisp y su multiple function return values, aquí volvemos un vector en lugar; el primer elemento es el texto recopilado de , salida estándar, y el segundo elemento es el valor devuelto al evaluar el formulario del cuerpo.

Cuestiones relacionadas