2017-10-15 84 views
1

如果我有一個名稱空間符號,例如'clojure.core或者一個clojure源文件的路徑我怎樣才能得到所有名稱空間的新符號,即不是:refer -ed或在另一個命名空間中被實現?如何獲取Clojure名稱空間中的所有新符號

這些符號將來自頂級def s(和defn s),但也包含在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

您收到的評論告訴您如何獲得頂級參考,但只有一種獲取本地允許綁定的方法,那就是訪問僅在宏內可用的&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} 
相關問題