Я думаю, что лучше использовать пример. Допустим, у меня есть упорядоченное дерево:
(def abcd [:a [:b :c] :d])
Я хочу построить из него коллекцию карт ключ-значение, каждая карта представляет собой узлы этого дерева со случайным именем и всей соответствующей информацией, которая is, его родитель (nil для узла root), его индекс (0, 1, 2 ..) и, если это листовой узел, его содержимое (например, ": a"). Например, в этом случае это может быть:
[{:name G__36654, :parent nil, :index 0}
{:name G__36655, :content :a, :parent G__36654, :index 0}
{:name G__36656, :parent G__36654, :index 1}
{:name G__36657, :content :b, :parent G__36656, :index 0}
{:name G__36658, :content :c, :parent G__36656, :index 1}
{:name G__36659, :content :d, :parent G__36654, :index 2}]
Я определил функцию, которая, кажется, делает то, что я хочу, но она использует рекурсию, вызывая себя, и у меня возникают проблемы с выяснением, как использовать l oop - повториться, и я верю, что должно быть что-то лучшее там. Вот моя попытка:
(defn mttrav "my tree traversal"
([ptree parent index]
(let [name (gensym)]
(cond
(not (coll? ptree)) [ {:name name :content ptree :parent parent :index index}]
:else (reduce into
[{:name name :parent parent :index index}]
(map-indexed #(mttrav %2 name %1) ptree)))))
([ptree]
(mttrav ptree nil 0)))
Кстати, я не знаю, является ли вектор подходящим для использования набором, возможно, набор будет более целесообразным, но я использую вектор для более легкой отладки, так как это более читабельно, когда порядок, в котором генерируются узлы, сохраняется, и если узлы случайно повторяются, я хочу его увидеть.
Заранее спасибо!
Редактировать: просто уточнить, было бы также допустимо, чтобы каждый узел имел список: дочерних узлов вместо: родительского узла и некоторых других вариантов, если это плоская коллекция карт, каждая карта представляет узел с уникальным: name, и положение, содержание и родительско-дочерние отношения узлов фиксируются в этой структуре. Предполагается, что входными данными являются деревья разбора сбоя, обычно поступающие из Instaparse, а карты должны стать записями для вставки в сеанс Клары.