Clojure中树的打印级别

Clojure中树的打印级别,clojure,Clojure,我已经环顾四周了,我看不出有什么办法可以做到这一点。 我只想逐级打印一棵树 因此,“[a[b c]]将打印出: a b c 如果我正确理解了您的意思,此代码应该可以工作: (defn bf [root] (if (vector? root) (let [roots (filterv (complement vector?) root) children (filterv vector? root)] (if-not (empty? childr

我已经环顾四周了,我看不出有什么办法可以做到这一点。 我只想逐级打印一棵树

因此,
“[a[b c]]
将打印出:

a
b c

如果我正确理解了您的意思,此代码应该可以工作:

(defn bf
  [root] 
  (if (vector? root)
    (let [roots (filterv (complement vector?) root)
          children (filterv vector? root)]
      (if-not (empty? children)
        (into [roots] (mapcat bf children))
        [roots]))
    root))
它不是惰性的,它返回包含节点的向量向量,例如

(bf ['a ['b 'c] 'd ['e 'f]]) => [[a d] [b c] [e f]]
打印:

(let [xs (bf ['a ['b 'c] 'd ['e 'f]])]
   (doseq [line (map str/join xs)] ; you need to require [clojure.string :as str]
     (println line)))

没有人P为了得到答案,我的头完全被敲碎了!我没有。我在看,从下午1点开始一直在做。好像有一个心理障碍在进行。我来自爪哇background@DanielJour对不起,忘了标记你了……嗯,你想要的是一个树的宽度优先遍历。我没有时间写一个答案,但你应该能够利用这些信息找到一些东西。可能不是你想要的,但可能仍然足够好。这就是我的意思,Marcin,谢谢你的努力,尽管这正是我需要的。我希望你能从中得到比我更好的感觉:(这一切归结为您选择的表示法。对不起,我无法理解它。这就是为什么我建议使用另一种表示法,对于lisps而言,这是一种更规范的表示法。我的解决方案对您不起作用吗?您只需逐个打印每个向量。如果查看结果,每个向量对应于您想要的一行打印出来(例如[a d])。那么我如何一次打印出一个向量呢?谢谢,我会看看这是否与我需要的相似。可能需要一些调整,但是的:)尽管它们打印出来,但它们不一定在同一级别上。