2017-10-15 4 views
1

Wenn ich ein Namespacesymbol z. 'clojure.core oder ein Pfad zu einer Clojure-Quelldatei Wie kann ich alle Symbole erhalten, die neu im Namespace sind, d. H. Nicht :refer -ed oder in einem anderen Namespace interniert?So erhalten Sie alle neuen Symbole in einem Clojure-Namespace

Diese Symbole würden von der obersten Ebene def s (und defn s) aber auch innerhalb let Bindungen und so kommen. Mein Ziel ist es, einen Namespace zu analysieren und den Baum zu durchlaufen, um auf bestimmten Symbolen basierend auf einem Prädikat einen Find-Replace durchzuführen.

Edit: Ich bin nicht nur auf der Suche nach Top-Level-Vars, ich suche nach einem Symbol. Wenn es eine Funktion mit einer Bindung gibt, bin ich auf der Suche nach einem Symbol, das gebunden ist.

+0

Sie werden wahrscheinlich eher verwenden möchten clojure.tools.analyzer als sich um den Baum zu Fuß. Es sollte Ihnen in der Lage sein, Ihnen zu sagen, wo Symbole als Teil des Baumspaziergangs sowieso herkommen, so dass Sie diesen vorbereitenden Schritt nicht brauchen, um "neue" Symbole zu sammeln. – amalloy

+0

Mögliches Duplikat von [Wie listet man die Funktionen eines Namensraums auf?] (Https://stackoverflow.com/questions/2747294/how-to-list-the-functions-of-a-namespace) – Mars

+0

Siehe https: // stackoverflow.com/a/19664649/1455243. Ihre Frage nicht genau das gleiche wie [Funktionen eines Namespace auflisten] (https://stackoverflow.com/questions/2747294/how-to-list-the-functions-of-a-namespace/19664649#19664649) aber 'dir' in dieser Antwort tut, was Sie wollen, so scheint es. – Mars

Antwort

2

Die Kommentare haben Sie sagen, Sie erhalten haben, wie die Top-Level-Refs zu bekommen, aber es gibt nur einen Weg, um die lokale let-Bindungen zu erhalten, und das ist die &env besondere Form zuzugreifen, die nur innerhalb eines Makros zur Verfügung:

(defmacro info [] 
    (println &env)) 

(def a 5) 
(let [b a] (let [c 8] (info))) 

;{ b #object[clojure.lang.Compiler$LocalBinding 0x72458346 [email protected]], 
; C#object[clojure.lang.Compiler$LocalBinding 0x5f437195 [email protected]]} 

um eine Karte von lokalen Namen zu lokalen Werte, zum Beispiel zu erhalten:

(defmacro inspect [] 
    (->> (keys &env) 
     (map (fn [k] [`'~k k])) 
     (into {}))) 

(let [b a] (let [c 8] (inspect))) 
; => {b 5, c 8} 
Verwandte Themen