Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何获取Clojure命名空间中的所有新符号_Clojure_Namespaces - Fatal编程技术网

如何获取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范围中的非内部符号