如何获取Clojure命名空间中的所有新符号
如果我有一个名称空间符号,例如如何获取Clojure命名空间中的所有新符号,clojure,namespaces,Clojure,Namespaces,如果我有一个名称空间符号,例如'clojure.core或一个clojure源文件的路径,我如何才能获得名称空间中所有新的符号,即不:请参阅另一个名称空间中的-ed或interned 这些符号将来自顶级defs(和defns),但也来自let绑定等内部。我的目标是分析一个名称空间,并在树中有效地遍历,基于谓词对某些符号进行查找替换 编辑:我不只是在寻找顶级变量,我在寻找任何符号。如果函数中有let绑定,我将查找绑定的符号。您收到的注释告诉您如何获取顶级引用,但是获取本地let绑定只有一种方法,那
'clojure.core
或一个clojure源文件的路径,我如何才能获得名称空间中所有新的符号,即不:请参阅另一个名称空间中的-ed或interned
这些符号将来自顶级def
s(和defn
s),但也来自let
绑定等内部。我的目标是分析一个名称空间,并在树中有效地遍历,基于谓词对某些符号进行查找替换
编辑:我不只是在寻找顶级变量,我在寻找任何符号。如果函数中有let绑定,我将查找绑定的符号。您收到的注释告诉您如何获取顶级引用,但是获取本地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}
您可能希望使用clojure.tools.analyzer,而不是自己在树上行走。作为树行走的一部分,它应该能够告诉您符号来自何处,因此您不需要收集“新”符号的初步步骤。请参阅可能的副本。您的问题与答案不完全相同,但答案中的dir
似乎符合您的要求。不完全一样,dir不会像let绑定中那样获得var范围中的非内部符号