在Clojure中,如何打印矢量的内容? (我想到了控制台,通常用于调试目的)。如果答案可以推广到任何好的Seq。
修改 我应该补充说,它应该是一个简单的函数,它提供看起来合理的输出,因此每行打印一个项目 - 因此可以很容易地用于调试目的。我确信有些库可以做到这一点,但使用库确实看起来有点过分。
答案 0 :(得分:5)
我通常使用println
。您可能还想尝试其他几种打印功能。见" IO" Clojure cheatsheet。
这不是Java。只需打印它,看起来就可以了。
您还可以使用clojure.pprint/pprint
来打印它。这对于大型复杂的数据结构很有帮助。
这些方法适用于所有基本的Clojure数据结构。
例外:由于显而易见的原因,不要打印无限长的惰性结构,例如(range)
返回的结构。为此,您可能需要编写特殊代码。
答案 1 :(得分:2)
这对我有用:
(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")))
答案 2 :(得分:1)
如果您只想打印出序列/向量的元素,只需map
println
到序列/向量,但请确保强制map
使用{进行评估{1}}:
dorun
这也可以应用于序列:
(dorun (map println [1 2 3 4]))
使用(dorun (map println '(1 2 3 4)))
执行此操作的另一种方法是将apply
与map
和println
一起调整到序列/向量:
apply
另一种方法是使用(apply (partial map println) [[1 2 3 4]])
(apply (partial map println) ['(1 2 3 4)])
:
doseq
答案 3 :(得分:0)
这个至少会阻止文本向右走太远:
(defn pp
([n x]
(binding [pp/*print-right-margin* n]
(-> x clojure.pprint/pprint)))
([x]
(pp 100 x)))
可以执行此功能的partial
来改变宽度。