在Clojure中,如何打印向量的内容?(我想到控制台,并且通常是为了调试目的)。如果答案可以概括地适用于任何Seq,那就太好了。
编辑:我应该补充说,它应该是一个简单的函数,可以给出看起来合理的输出,因此每行打印一个项目-因此可以轻松用于调试目的。我相信有一些库可以做到这一点,但使用库似乎确实过度了。
编辑:我应该补充说,它应该是一个简单的函数,可以给出看起来合理的输出,因此每行打印一个项目-因此可以轻松用于调试目的。我相信有一些库可以做到这一点,但使用库似乎确实过度了。
我通常使用println
。还有其他几种打印函数可以尝试。请参见Clojure cheatsheet中的“IO”部分。
这不是Java。只需打印它,它就会看起来很好。
您还可以使用clojure.pprint/pprint
进行漂亮的打印。对于大型复杂数据结构,这可能会有所帮助。
这些方法适用于所有基本的Clojure数据结构。
例外:不要打印无限长的惰性结构,例如(range)
返回的内容--出于显而易见的原因。对此,您可能需要编写一些特殊代码。
map
println
应用于你的序列/向量,但务必确保使用dorun
强制map
执行评估:(dorun (map println [1 2 3 4]))
这也可以应用于序列:
(dorun (map println '(1 2 3 4)))
使用apply
的另一种方法是将map
与println
柯里化,并将其应用于序列/向量:
(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))
(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")))
(defn pp
([n x]
(binding [pp/*print-right-margin* n]
(-> x clojure.pprint/pprint)))
([x]
(pp 100 x)))
print-table
是专门用于打印 Clojure 映射序列的。如果您有这样的数据(或者可以转换成这样的数据),那么它可能非常适合您。 - Marsprint-table
替换了我简单手写的表格,但是却得到了Exception in thread "main" java.lang.ClassCastException: java.lang.Long cannot be cast to java.util.Map$Entry
的异常。 - Chris Murphyprn
几乎总是比println
更好。println
使用Java的toString
,其设计目标与Clojure数据结构不同,因此可能会得到误导性的输出。例如,["a b c"]
和[a b c]
在使用println
时无法区分。 - amalloyprint-table
。 - Mars