Печать примитивных массивов в Clojure - PullRequest
12 голосов
/ 05 декабря 2011

Я нахожусь в REPL, и я создаю массив Java:

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

Конечно, если я хочу посмотреть на мой arr, я получаю:

=> arr
#<double[] [D@2ce628d8>

Могу ли я что-нибудь сделать, чтобы массивы java-примитивов печатались как у clojure persistentVector s?

=> arr
[1.0 2.0 3.0]

Я знаю, что могу обернуть свои массивы в какую-нибудь красивую функцию печати (вот что яв настоящее время), но это боль в тех случаях, например, когда векторы являются частью карты:

=> my-map
{"1" #<double[] [D@47254e47>, "2" #<double[] [D@11d2625d>}

Ответы [ 3 ]

18 голосов
/ 06 декабря 2011

Может ли что-нибудь простое сделать следующее?

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

Если это только для REPL, то, возможно, техническая семантика не имеет значения.

Обновление

Оказывается, что симпатичная печать (pprint) прекрасно работает с вашей картой векторов:

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

Окончательное обновление: из обсуждения в группах Google в комментариях

Спрашивающий нашел ответ, который ему понравился, в обсуждении, перефразированном ниже:

> Есть ли способ сделать Clojure repl pretty-print по умолчанию?

Попробуйте:

(clojure.main/repl :print pprint)

> Спасибо! Это именно то, что мне было нужно.

1 голос
/ 06 декабря 2011

Всегда есть решение для взаимодействия с Java:

(java.util.Arrays/toString arr)

Так что вы бы

(map #(java.util.Arrays/toString (val %)) my-map)
1 голос
/ 06 декабря 2011

Функция str просто вызывает .toString объекта Java, что не слишком удобно для массивов. Чтобы получить хорошее представление (как уже говорили другие) (java.util.Arrays / toString arr) можно вызвать.

Однако, как это может быть реализовано прозрачно в обычном коде clojure println и str? Можем ли мы реализовать прокси на массиве и заменить метод .toString? Или мы должны реализовать новый протокол str2, используя str для всего, кроме класса Array?

Полагаю, наилучшим вариантом будет проксируемый arr, поскольку он будет работать с другим кодом, который вызывает для него str, даже если он вызывался из другого пространства имен. Не знаю, как реализовать прокси на Array:)

...