如何在Clojure命名空间中获取所有新符号

时间:2017-10-15 18:40:20

标签: clojure namespaces

如果我有名称空间符号,例如'clojure.core或clojure源文件的路径如何获取命名空间中新的所有符号,即不是:refer - 在另一个命名空间中编辑或实习?

这些符号来自顶级def s(和defn s),但也来自let绑定等。我的目标是分析命名空间并有效地遍历树,根据谓词对某些符号进行查找替换。

编辑:我不只是寻找顶级变量,我正在寻找任何符号。如果有一个带有let绑定的函数,我就会寻找绑定的符号。

1 个答案:

答案 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}