Clojure打印延迟序列

Clojure打印延迟序列,clojure,lazy-sequences,Clojure,Lazy Sequences,我试图打印出我的二叉树,但是Clojure给了我一个很难正确打印序列的时间 例如,我有一个节点列表”(1 2 3) 在每次迭代中,我想打印出每个元素前后都有许多空格的节点 (defn spaces [n] (apply str (repeat n " "))) 太好了,这似乎有效 因此,假设我有一个节点的列表(:a:b:c)我想打印在一行上,如前所述,带有空格 (println (map #(str (spaces before) % (spaces (dec before))) node

我试图打印出我的二叉树,但是Clojure给了我一个很难正确打印序列的时间

例如,我有一个节点列表
”(1 2 3)

在每次迭代中,我想打印出每个元素前后都有许多空格的节点

(defn spaces [n]
  (apply str (repeat n " ")))
太好了,这似乎有效

因此,假设我有一个
节点的列表(:a:b:c)
我想打印在一行上,如前所述,带有空格

(println (map #(str (spaces before) % (spaces (dec before))) nodes))
我有一份物品清单。使用地图,我得到了一个字符串对象列表。太好了,我可以把它们打印出来

但这给了我这样的信息:

(clojure.lang.LazySeq@d0b37c31 clojure.lang.LazySeq@105879a9 clojure.lang.LazySeq@8de18242)
(clojure.lang.LazySeq@d0b37c31 clojure.lang.LazySeq@105879a9 clojure.lang.LazySeq@8de18242)
所以我在谷歌上搜索了如何打印惰性序列,然后开始使用
print str
命令。根据文档,它打印成一个字符串,然后返回

(println (print-str (map #(str (spaces before) % (spaces (dec before))) nodes)))
但这给了我这样的信息:

(clojure.lang.LazySeq@d0b37c31 clojure.lang.LazySeq@105879a9 clojure.lang.LazySeq@8de18242)
(clojure.lang.LazySeq@d0b37c31 clojure.lang.LazySeq@105879a9 clojure.lang.LazySeq@8de18242)
不变。。人力资源管理。非常感谢您的帮助

user> (str (map inc (range 10)))
"clojure.lang.LazySeq@c5d38b66"
user> (pr-str (map inc (range 10)))
"(1 2 3 4 5 6 7 8 9 10)"
str
调用
LazySeq
toString
方法,这避免了通过不透明地显示对象标识来实现值的惰性序列。
pr str
函数调用对象的
print dup
多方法,该方法旨在获取读者可以理解的事物版本(因此对于
LazySeq
而言,是使
LazySeq
相等的文本值)

有关结构的漂亮格式,请查看
clojure.pprint
命名空间,该命名空间随
clojure.core
一起提供,它具有
pprint
打印表
,以及用于自定义漂亮打印行为的各种函数

user> (require '[clojure.pprint :as pprint :refer [pprint print-table]])
nil
user> (pprint [:a [:b :c :d [:e :f :g] :h :i :j :k] :l :m :n :o :p :q [:r :s :t :u :v] [:w [:x :y :z]]])
[:a
 [:b :c :d [:e :f :g] :h :i :j :k]
 :l
 :m
 :n
 :o
 :p
 :q
 [:r :s :t :u :v]
 [:w [:x :y :z]]]
nil
user> (print-table (map #(let [start (rand-int 1e6)] (zipmap % (range start (+ start 10)))) (repeat 5 [:a :b :c :d :e :f :g :h :i :j])))

|     :a |     :c |     :b |     :f |     :g |     :d |     :e |     :j |     :i |     :h |
|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
| 311650 | 311652 | 311651 | 311655 | 311656 | 311653 | 311654 | 311659 | 311658 | 311657 |
|  67627 |  67629 |  67628 |  67632 |  67633 |  67630 |  67631 |  67636 |  67635 |  67634 |
| 601726 | 601728 | 601727 | 601731 | 601732 | 601729 | 601730 | 601735 | 601734 | 601733 |
| 384887 | 384889 | 384888 | 384892 | 384893 | 384890 | 384891 | 384896 | 384895 | 384894 |
| 353946 | 353948 | 353947 | 353951 | 353952 | 353949 | 353950 | 353955 | 353954 | 353953 |
nil

很好理解!非常感谢。在我看来,
str
似乎并没有避免实现惰性序列:
user>(str(map#)(do(println%)(inc%))(range 10))
导致
0123456789“clojure.lang。LazySeq@c5d38b66“