2010-08-28 23 views
11

Hay printf. Imprime directamente en stdout.Clojure sprintf?

¿Qué hay de sprintf, que formatea de la misma manera que printf, pero devuelve una cadena sin efectos secundarios?

Respuesta

15

En Clojure se llama format y reside en clojure.core: printf es equivalente a (comp print format).

9

Debe consultar cl-format, en el clojure.pprint lib. Es un puerto de la función de Common Lisp FORMAT. Se puede hacer cosas que Java de printf no se puede hacer, como condicionales, interactuando sobre SEQs, etc.

Para responder a su pregunta, con cl-format, un primer argumento de nil devolverá una cadena; un primer argumento de true se imprimirá en STDOUT.

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

Tenga en cuenta que si format no existen ya en Clojure, también se puede capturar la salida de Clojure de printf así:

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

with-out-str es útil cuando una biblioteca sólo proporciona una función que imprime a STDOUT y desea capturar la salida en su lugar. Me encontré con bibliotecas de Java que hacen esto.

+0

esas librerías de Java no escribirán a clojure de \ * a cabo \*, ¿lo harán? Debería secuestrar System/setOut con PrintWriter que usa la var. – gtrak

5

Considere el uso de la macro con la salida-str:

(with-out-str 
    (print x)) 

O simplemente llamar al método formato de java.lang.String:

(String/format "%d" 3)