2017-10-15 18 views
1

たとえば、名前空間シンボルがある場合。 'clojure.coreまたはクローゼアソースファイルへのパスネームスペースに新規のシンボルをすべて取得するにはどうすればいいですか?つまり、:referではないか、別のネームスペースで使用されていませんか?Clojureネームスペース内のすべての新しいシンボルを取得する方法

これらのシンボルは、最上位レベルdef(およびdefn)から来るだけでなく、letバインディングなどに由来します。私の目標は、名前空間を分析して、述語に基づいて特定のシンボルに対して効果的に検索置換を実行することです。

編集:私はトップレベルのバールを探しているだけではなく、どんなシンボルも探しています。 letバインディングを持つ関数があれば、私は束縛されたシンボルを探しています。

+0

あなたはおそらく、むしろ木を自分で歩くよりもclojure.tools.analyzer使用したいと思うでしょう。とにかくツリーの一部としてシンボルが来る場所を教えてくれるはずですので、とにかく "新しい"シンボルを集めるこの予備的なステップは必要ありません。 – amalloy

+0

[名前空間の機能をリストする方法](https://stackoverflow.com/questions/2747294/how-to-list-the-functions-of-a-namespace) – Mars

+0

https://を参照してください。 stackoverflow.com/a/19664649/1455243あなたの質問は[名前空間の機能をリストする方法]と全く同じではありません(https://stackoverflow.com/questions/2747294/how-to-list-the-functions-of-a-namespace/19664649#19664649)。その答えの中の「dir」はあなたが望むことをします、それは現れます。 – Mars

答えて

2

コメントにはトップレベルのリファレンスを取得する方法が記載されていますが、ローカルのレットバインディングを取得する方法は1つだけです。

&env特殊フォームにアクセスします
(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]]} 

例えば、ローカルの値にローカル名のマップを取得するには:

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

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