2013-02-13 5 views
9

sagen, dass ich einen Clojure Baum haben, wie unten definiertVerfahrgeschwindigkeit, Iterieren, besuchen Bäume in Clojure

(def eval-logic 
    '(:OR 
    (:METHOD "methodName1" ["a1" "a2" "a3"]) 
    (:METHOD "methodName2" ["b1" "b2" "b3"]) 
    :AND 
     (:METHOD "methodName3" []) 
     (:METHOD "methodName4" ["d1"]) 
    )) 

D.h. Der Baum repräsentiert einen booleschen Ausdruck, wobei Knoten wie: OR und: AND boolesche Operatoren darstellen und die Blätter des Baums Methodenaufrufe sind. Der Baum soll nicht ausgewertet werden, sondern nur durchlaufen werden, um Code zu generieren, der zur Laufzeit die eigentliche Auswertung durchführt. Wie soll ich den Baum durchqueren, verschiedene Arten von Knoten besuchen, nach dem Vater eines Knotens, Kindern, Geschwistern usw. fragen? Gibt es Zeiger oder Bibliotheken, in die man schauen kann?

Der Baum kann nicht zu tief verschachtelt werden, so dass Tail-Rekursion keine Rolle spielt. Fühlen Sie sich frei, eine andere Datenstruktur vorzuschlagen, die möglicherweise besser zu durchqueren ist.

Ich interessiere mich besonders für Tiefen-First-Traversals, da dies die Reihenfolge ist, die Code generiert werden muss, um sicherzustellen, dass Funktionen definiert sind, bevor sie verwendet werden. Auch der Baum ist gegeben und wird sich nicht ändern, also bin ich nicht an Dingen wie Hinzufügen oder Entfernen von Kindern interessiert

Antwort