2017-10-15 79 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} 
相关问题