2

Clojure Zipperを使用して次のグラフを作成しました

   A
 / | \      
B  C  D
     / \
    E   F

次のコードを使用します。

(require '[clojure.zip :as z])    
(def g (z/vector-zip ["A" ["B" "C" "D"["E" "F"]]]))

今、d3でビジュアライゼーションを作成したいので、EDN形式でグラフを表現したいのですが、

[{:from "A" :to "B"}
 {:from "A" :to "C"}
 {:from "A" :to "D"}
 {:from "D" :to "E"}
 {:from "D" :to "F"}]

私はこれを試しました

(loop [t g]
  (if-not (z/end? t)
    (do
      (if-not (z/branch? t)
        (println {:from (-> t (get 1) :ppath :l) :to (z/node t)})
        )
      (recur (z/next t))
      )
    )
  )

唯一の問題は、子 E と F にあり、その親ノード D を追跡できませんでした。

4

2 に答える 2

1

そこにあるツリーの構文を少し変更して、基本的に親と子のペアをベクトルに格納し、独自のジッパーをロールすることができます。例えば

(def v [\a [\b [\c [\z]] [\d [\e \f]]]])
(def g 
  (z/zipper 
    vector? ; a vector/pair is a branch
    #(concat (second %)) ; might be a smarter way to get the childs
    nil ; don't support edit
    v))
(loop [t (z/next g)] ; skip first
  (if-not (z/end? t)
    (do
      (println {
                :from (-> t z/up z/node first) ; parents are always vectors
                :to (if (z/branch? t) (-> t z/node first) (z/node t))}) ; if vector, then first
      (recur (z/next t)))))

;;=> {:from a, :to b}
;;=> {:from a, :to c}
;;=> {:from c, :to z}
;;=> {:from a, :to d}
;;=> {:from d, :to e}
;;=> {:from d, :to f}
于 2015-02-20T15:29:55.053 に答える