如果我有名称空间符号,例如'clojure.core
或clojure源文件的路径如何获取命名空间中新的所有符号,即不是:refer
- 在另一个命名空间中编辑或实习?
这些符号来自顶级def
s(和defn
s),但也来自let
绑定等。我的目标是分析命名空间并有效地遍历树,根据谓词对某些符号进行查找替换。
编辑:我不只是寻找顶级变量,我正在寻找任何符号。如果有一个带有let绑定的函数,我就会寻找绑定的符号。
答案 0 :(得分:2)
您收到的评论告诉您如何获取顶级引用,但是只有一种方法可以获取本地let绑定,而这只是访问&env
特殊形式,该格式仅在宏:
(defmacro info []
(println &env))
(def a 5)
(let [b a] (let [c 8] (info)))
;{ b #object[clojure.lang.Compiler$LocalBinding 0x72458346 clojure.lang.Compiler$LocalBinding@72458346],
; c #object[clojure.lang.Compiler$LocalBinding 0x5f437195 clojure.lang.Compiler$LocalBinding@5f437195]}
获取本地名称到本地值的映射,例如:
(defmacro inspect []
(->> (keys &env)
(map (fn [k] [`'~k k]))
(into {})))
(let [b a] (let [c 8] (inspect)))
; => {b 5, c 8}