2011-08-22 10 views
6

Sto usando with-out-str per acquisire alcuni dati che vengono stampati su stdout. Il problema è che with-out-str sembra buttare via il valore di ritorno dalla mia funzione. C'è un modo in cui posso catturare entrambi? Mi piacerebbe avere la mia torta e mangiarla anch'io.Cattura il valore di ritorno "originale" da with-out-str

Esempio:

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

A quale valore di riferimento si riferisce? Il '2' è tornato dalla valutazione di' (+ 1 1) '? – seh

risposta

8

Aping la definizione della biblioteca del nucleo with-out-str macro, è possibile definire uno simile come questo:

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

Senza the values function from Common Lisp e la sua multiple function return values, qui torniamo un vettore anziché; il primo elemento è il testo raccolto da output standard e il secondo elemento è il valore restituito dalla valutazione del modulo corpo.