2010-08-28 9 views
11

C'è printf. Stampa direttamente su stdout.Clojure sprintf?

Che ne dici di sprintf, che formatta allo stesso modo di printf, ma restituisce una stringa senza effetti collaterali?

risposta

15

In Clojure si chiama format e risiede in clojure.core: printf equivale a (comp print format).

9

Si consiglia di verificare cl-format, nel clojure.pprint lib. È una porta della funzione FORMAT del Common Lisp. Si può fare cose che Java printf non può fare, come condizionali, iterazione su seguenti del regolamento provvisorio, ecc

Per rispondere alla tua domanda, con cl-format, un primo argomento di nil restituirà una stringa; un primo argomento di true verrà stampato su STDOUT.

user> (cl-format nil "~{~R~^, ~}" [1 2 3 4]) 
"one, two, three, four" 

Nota che se format non esistessero già in Clojure, si potrebbe anche catturare l'output da Clojure di printf come questo:

user> (with-out-str (printf "%s" :foo)) 
":foo" 

with-out-str è utile quando una libreria fornisce solo una funzione che le stampe a STDOUT e vuoi invece catturare l'output. Ho attraversato librerie Java che lo fanno.

+0

queste librerie Java non scriveranno clojure di \ * fuori \ *, lo faranno? Avresti bisogno di dirottare System/setOut con un PrintWriter che usa la var. – gtrak

5

Si consiglia di utilizzare la con-out-str macro:

(with-out-str 
    (print x)) 

O semplicemente chiamare il metodo format di java.lang.String:

(String/format "%d" 3)