在Clojure中打印基元数组

在Clojure中打印基元数组,clojure,pretty-print,Clojure,Pretty Print,我在REPL,我创建了一个java数组: => (def arr (double-array [1 2 3])) 当然,如果我想查看我的arr,我会得到: => arr #<double[] [D@2ce628d8> 我知道我可以用某种漂亮的打印功能包装我的数组(这是我目前所做的),但这在一些情况下是一个难题,例如,向量是地图的一部分: => my-map {"1" #<double[] [D@47254e47>, "2" #<double[]

我在REPL,我创建了一个java数组:

=> (def arr (double-array [1 2 3]))
当然,如果我想查看我的
arr
,我会得到:

=> arr
#<double[] [D@2ce628d8>
我知道我可以用某种漂亮的打印功能包装我的数组(这是我目前所做的),但这在一些情况下是一个难题,例如,向量是地图的一部分:

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

str函数只调用Java对象的.toString,这在数组中不太方便。为了得到一个好的表示(正如其他人也说过的那样)(java.util.Arrays/toString-arr)可以被调用

然而,如何在正常的clojure println和str代码中透明地实现这一点?我们可以在数组上实现代理并替换.toString方法吗?或者我们应该实现一个新的str2协议,除了Array类之外的所有东西都使用str吗


我猜代理arr将是最好的选择,因为这将与在其上调用str的其他代码一起工作,即使它是从另一个名称空间调用的。不知道如何在阵列上实现代理:)

java互操作解决方案始终存在:

(java.util.Arrays/toString arr)
所以你会

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

像下面这样简单的事情行吗

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]}
最终更新:来自评论中链接的谷歌群组讨论

提问者在下面的讨论中找到了他喜欢的答案:

>有没有办法让Clojure repl在默认情况下打印得漂亮

尝试:

(clojure.main/repl:print-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]}