Clojure打印向量的内容

7
在Clojure中,如何打印向量的内容?(我想到控制台,并且通常是为了调试目的)。如果答案可以概括地适用于任何Seq,那就太好了。
编辑:我应该补充说,它应该是一个简单的函数,可以给出看起来合理的输出,因此每行打印一个项目-因此可以轻松用于调试目的。我相信有一些库可以做到这一点,但使用库似乎确实过度了。
4个回答

8

我通常使用println。还有其他几种打印函数可以尝试。请参见Clojure cheatsheet中的“IO”部分。

这不是Java。只需打印它,它就会看起来很好。

您还可以使用clojure.pprint/pprint进行漂亮的打印。对于大型复杂数据结构,这可能会有所帮助。

这些方法适用于所有基本的Clojure数据结构。

例外:不要打印无限长的惰性结构,例如(range)返回的内容--出于显而易见的原因。对此,您可能需要编写一些特殊代码。


感谢您提供的备忘单建议。看起来我需要使用http://clojuredocs.org/clojure.pprint/print-table。 - Chris Murphy
1
print-table 是专门用于打印 Clojure 映射序列的。如果您有这样的数据(或者可以转换成这样的数据),那么它可能非常适合您。 - Mars
我用print-table替换了我简单手写的表格,但是却得到了Exception in thread "main" java.lang.ClassCastException: java.lang.Long cannot be cast to java.util.Map$Entry的异常。 - Chris Murphy
3
在查看Clojure对象时,prn几乎总是比println更好。println使用Java的toString,其设计目标与Clojure数据结构不同,因此可能会得到误导性的输出。例如,["a b c"][a b c]在使用println时无法区分。 - amalloy
Chris,关于异常,请看我的第一条评论。听起来你试图在整数序列上使用 print-table - Mars
显示剩余2条评论

3
如果你只想打印出序列/向量的元素,你可以将map println应用于你的序列/向量,但务必确保使用dorun强制map执行评估:
(dorun (map println [1 2 3 4]))

这也可以应用于序列:

(dorun (map println '(1 2 3 4)))

使用apply的另一种方法是将mapprintln柯里化,并将其应用于序列/向量:

(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))

3
这对我有效:
(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")))

1
这个至少可以防止文本向右溢出:
(defn pp
  ([n x]
   (binding [pp/*print-right-margin* n]
     (-> x clojure.pprint/pprint)))
  ([x]
   (pp 100 x)))

这个函数可以进行部分更改以改变宽度。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接