在Clojure中打印基元数组
我在REPL,我创建了一个java数组:在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[]
=> (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]}