ich brauche, um dynamisch Daten dieser Struktur zu ändern:Clojure Prewalk unendliche Rekursion für datomic Abfragen
[:db/id
:list/title
:list/type
{:list/items [... lots of nested data ...]}]
auf die folgenden:
[:db/id
:list/title
:list/type
{(default :list/items []) [... lots of nested data ...]}]
Da ich mehrere Anfragen Handhabung bin, kann ich sein sicher, dass der Join der vierte Punkt im Vektor sein wird. Aber ich muss jede Instanz von :list/items
durch (default :list/items [])
ersetzen.
Der einzige Weg, den ich kenne, ist mit clojure.walk/prewalk
. Es führt jedoch zu unendlicher Rekursion:
(clojure.walk/prewalk #(if (= :list/items %)
'(default :list/items [])
%)
query)
Sobald die Wanderung findet :list/items
und ersetzt sie durch '(default :list/items [])
, es dann die :list/items
in dem ersetzten Wert findet, und ersetzt das. Und so weiter und so fort.
Ich kann ein Atom verwenden, um sicherzustellen, dass der Wert nur einmal ersetzt wird, aber das fühlt sich an wie Betrug.
Irgendwelche anderen Ansätze?
Oh schön, postwalk-ersetzen ist perfekt. Aus Neugier, sagen wir mal, musste ich Prewalk verwenden, um die Abfrage auf andere Weise zu manipulieren. Müsste ich ein Atom verwenden, um den Ersatz zu verfolgen? Oder gibt es einen anderen Weg? – egracer
was genau meinst du? (Ich kann jetzt nicht daran denken) – leetwinski
aber ich würde dir vorschlagen, einen Blick auf 'Zipper' zu werfen. Wenn Sie eine feinkörnige Kontrolle über die Ersetzung und Iteration über den Baum wünschen. Zum Beispiel würde es Ihnen erlauben, einige Elemente zu ersetzen, und dann dieses Element zu überspringen, oder es in einem Akkumulator zu verfolgen (da Reißverschlüsse gut mit 'loop/recur 'funktionieren – leetwinski