2011-12-05 24 views
12

estoy en el REPL, y se crea una matriz java:impresión matrices primitivas en Clojure

=> (def arr (double-array [1 2 3])) 

Por supuesto, si quiero mirar mi arr, me sale:

=> arr 
#<double[] [[email protected]> 

¿Hay algo que pueda hacer que haga que las matrices de las primitivas Java se impriman como las de Clojure persistentVector s?

=> arr 
[1.0 2.0 3.0] 

Sé que podría envolver mis matrices en algún tipo de función de impresión agradable (que es lo que actualmente hago), pero esto es un dolor en casos, por ejemplo, donde los vectores son parte de un mapa:

=> my-map 
{"1" #<double[] [[email protected]>, "2" #<double[] [[email protected]>} 

Respuesta

18

¿Podría algo tan simple como la siguiente no ?

user=> (seq arr) 
(1.0 2.0 3.0) 

Si es solo para REPL, entonces quizás la semántica técnica no importe.

actualización

Resulta que bonito estampado (pprint) funciona muy bien con su mapa de vectores:

user=> (def my-map {"1" (double-array [1 2 3]) 
        "2" (double-array [1 2 3])}) 
#'user/my-map 
user=> (pprint my-map) 
{"1" [1.0, 2.0, 3.0], "2" [1.0, 2.0, 3.0]} 

Informe final de actualización: Desde el ligado discusión Grupos de Google en los comentarios

Interlocutor encontró una respuesta que le gustaba en una discusión parafraseada a continuación:

> ¿Hay alguna manera de hacer que la copia Clojure bellamente se imprima por defecto?

Probar:

(clojure.main/repl :print pprint)

> Gracias! Eso es exactamente lo que necesitaba.

+0

Gracias, scott. La letra bonita es la mitad de la respuesta aquí. La otra mitad es: http://groups.google.com/group/clojure/browse_thread/thread/c9db56b8daeaffa2?fwc=1&pli=1 – charleslparker

+1

Wow. Eso es realmente genial. Me encanta cuando descubrimos algo juntos a través de Stack Overflow. ¡High Fives para el trabajo en equipo! – Scott

+0

@ScottLowe: inclúyalo en su respuesta. No estaría de más tener ambas mitades en un solo lugar :) –

1

la función str sólo llama a la .toString del objeto de Java, que no es demasiado conveniente en matrices. Para obtener una buena representación (como otros también han indicado) (java.util.Arrays/toString arr) se puede llamar.

Sin embargo, ¿cómo podría implementarse esto de forma transparente en la impresión normal de clojure y en el código str? ¿Podríamos implementar un proxy en Array y reemplazar el método .toString? ¿O deberíamos implementar un nuevo protocolo str2 usando str para todo excepto la clase Array?

Supongo que la proxied arr sería la mejor opción, ya que funcionaría con otro código que invoque str, incluso si se llamó desde otro espacio de nombres. Ni idea de cómo implementar un proxy en la matriz aunque :)

1

No es siempre la solución de interoperabilidad de Java:

(java.util.Arrays/toString arr) 

por lo que tendría

(map #(java.util.Arrays/toString (val %)) my-map) 
Cuestiones relacionadas