【问题标题】:How to get all the new symbols in a Clojure namespace如何获取 Clojure 命名空间中的所有新符号
【发布时间】:2017-10-15 18:40:19
【问题描述】:

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

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

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

【问题讨论】:

标签: clojure namespaces


【解决方案1】:

您收到的 cmets 告诉您如何获取顶级 refs,但是只有一种方法可以获取本地 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}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    • 2011-03-25
    • 2011-06-21
    • 2015-05-25
    • 2011-08-12
    相关资源
    最近更新 更多