Постприкажите, чтобы обход дерева с clojure.zip отредактировал узлы

Мне представили дерево как вложенный вектор. Я хочу иметь обобщение indexed для деревьев, показывая индекс каждого узла как это,

(visit 42); => [0 42]
(visit [6 7]); => [0
              ;     [[0 6] 
              ;      [1 7]]]

Наивная реализация использовала бы clojure.zip непосредственно (как уже спросили здесь)

(defn visit [tree]
  (loop [loc (vector-zip tree)]
    (if (end? loc)
      (root loc)
      (recur 
        (next (edit loc #(conj 
                           [(count (lefts loc))] 
                           %)))))))

Но возвращение с clojure.zip/next выполняет обход перед порядком, приводящий к бесконечному циклу в этом случае (непосещаемые узлы добираются conjредактор в a [:found] вектор бесконечно). Другой подход использовал бы clojure.walk/postwalk, но это не предоставляет структурную информацию, такую как индекс.

Как Вы реализовали бы это? Есть ли a postorder-next для zip, которая решила бы его сразу же?

5
задан Community 23 May 2017 в 11:51
поделиться