Clojure打印矢量的内容

时间:2015-09-07 04:04:31

标签: clojure

在Clojure中,如何打印矢量的内容? (我想到了控制台,通常用于调试目的)。如果答案可以推广到任何好的Seq。

修改 我应该补充说,它应该是一个简单的函数,它提供看起来合理的输出,因此每行打印一个项目 - 因此可以很容易地用于调试目的。我确信有些库可以做到这一点,但使用库确实看起来有点过分。

4 个答案:

答案 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))) 执行此操作的另一种方法是将applymapprintln一起调整到序列/向量:

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来改变宽度。