Clojure打印向量的内容
在Clojure中,如何打印向量的内容?(我想象到控制台,通常是为了调试目的)。如果答案可以推广到任何Seq,那就好了 编辑: 我应该补充一点,它应该是一个简单的函数,提供看起来合理的输出,所以每行打印一个项目,这样就可以方便地用于调试目的。我确信有一些库可以做到这一点,但使用库确实似乎有些过分。这对我来说很有用:Clojure打印向量的内容,clojure,Clojure,在Clojure中,如何打印向量的内容?(我想象到控制台,通常是为了调试目的)。如果答案可以推广到任何Seq,那就好了 编辑: 我应该补充一点,它应该是一个简单的函数,提供看起来合理的输出,所以每行打印一个项目,这样就可以方便地用于调试目的。我确信有一些库可以做到这一点,但使用库确实似乎有些过分。这对我来说很有用: (defn pr-seq ([seq msg] (letfn [(lineify-seq [items] (apply st
(defn pr-seq
([seq msg]
(letfn [(lineify-seq [items]
(apply str (interpose "\n" items)))]
(println (str "\n--------start--------\n"
msg "\nCOUNT: " (count seq) "\n"
(lineify-seq seq) "\n---------end---------"))))
([seq]
(pr-seq seq nil)))
示例用法:
(pr-seq [1 2 3])
(pr-seq (take 20 blobs) (str "First 20 of " (count blobs) " Blobs")))
我通常使用
println
。您可能还想尝试其他几种打印功能。请参阅的“IO”部分
这不是Java。只要把它打印出来,看起来就可以了
您还可以使用clojure.pprint/pprint
漂亮地打印它。这对于大型、复杂的数据结构很有帮助
这些方法适用于所有基本Clojure数据结构
例外:不要打印无限长的惰性结构,比如
(range)
返回的内容——原因很明显。为此,您可能需要编写一些特殊的代码。此代码至少可以防止文本向右偏远:
(defn pp
([n x]
(binding [pp/*print-right-margin* n]
(-> x clojure.pprint/pprint)))
([x]
(pp 100 x)))
可以执行此功能的
partial
s来改变宽度 如果您只想打印序列/向量的元素,您可以将映射到序列/向量,但请确保使用dorun
强制map
进行评估:
(dorun (map println [1 2 3 4]))
这也适用于序列:
(dorun (map println '(1 2 3 4)))
使用apply
执行此操作的另一种方法是使用println
currymap
并apply
将其应用于序列/向量:
(apply (partial map println) [[1 2 3 4]])
(apply (partial map println) ['(1 2 3 4)])
另一种方法是使用doseq
:
(doseq [e [1 2 3 4]]
(println e))
(doseq [e '(1 2 3 4)]
(println e))
谢谢你的建议。看来这就是我想要的print table
是专门用来打印一系列Clojure地图的。如果这就是您拥有的(或可以转换为的),它可能是完美的。我用print table
替换了我简单的手写表格,但在线程“main”中得到了异常java.lang.ClassCastException:java.lang.Long不能强制转换为java.util.Map$Entry
prn
在检查clojure对象时几乎总是优于println
println
使用java的toString
,它与clojure数据结构有不同的设计目标,因此您可能会得到误导性的输出。例如,[“abc”]
和[abc]
与println
无法区分。谢谢@amalloy。我没有意识到这一点。