2011-12-05 14 views
12

Jestem w REPL i tworzę tablicę Java:poligraficzne Prymitywne Tablice w Clojure

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

oczywiście, jeśli chcę patrzeć na moją arr, otrzymuję:

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

Czy jest coś, co mogę zrobić, aby tablice prymitywów java były drukowane tak, jak w przypadku clojure'a persistentVector s?

=> arr 
[1.0 2.0 3.0] 

wiem mogę owinąć moje tablice w jakimś ładnym funkcji drukowania (która jest, co aktualnie robią), ale jest to ból w przypadkach, na przykład, gdy wektory są częścią mapie:

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

Odpowiedz

18

Would coś tak prostego jak następujący temat ?

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

Jeśli chodzi tylko o REPL, to być może semantyka techniczna nie ma znaczenia.

Aktualizacja

Okazuje się, że całkiem print (pprint) współpracuje tylko z mapy wektorów:

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]} 

Finał Aktualizacja: Z połączonych grupach dyskusyjnych Google w komentarzach

PYTAJĄCY znalazł odpowiedź, którą lubił w dyskusji, parafrazowanej poniżej:

> Czy istnieje sposób, aby Clojure domyślnie replikował ładny wydruk?

Spróbuj:

(clojure.main/repl :print pprint)

> Dziękujemy! Dokładnie tego potrzebowałem.

+0

Dzięki, Scott. Dobry druk to połowa odpowiedzi tutaj. Druga połowa to: http://groups.google.com/group/clojure/browse_thread/thread/c9db56b8daeafa2?fwc=1&pli=1 – charleslparker

+1

Wow. To jest naprawdę fajne. Uwielbiam to, gdy odkrywamy coś razem dzięki Stack Overflow. Wysokie piątki za pracę zespołową! – Scott

+0

@ScottLowe: Proszę uwzględnić to w swojej odpowiedzi. Nie zaszkodzi mieć obie połówki w jednym miejscu :) –

1

Funkcja str po prostu wywołuje .toString obiektu Java, co nie jest zbyt wygodne w przypadku tablic. Aby uzyskać ładną reprezentację (jak stwierdzili inni) (java.util.Arrays/toString arr) można wywołać.

Jak jednak można to zastosować w sposób przejrzysty w normalnym kodzie println i str? Czy możemy zaimplementować proxy w Array i zastąpić metodę .toString? A może powinniśmy zaimplementować nowy protokół str2 używając str dla wszystkiego oprócz klasy Array?

Domyślam się, że arr proxy byłby najlepszą opcją, ponieważ działałoby to z innym kodem, który wywołuje str, nawet jeśli został wywołany z innej przestrzeni nazw. Nie mam pojęcia jak zaimplementować proxy Array chociaż :)

1

Zawsze jest rozwiązanie java współdziałanie:

(java.util.Arrays/toString arr) 

Więc trzeba

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