gpt4 book ai didi

clojure - 如何获取 Clojure 命名空间中的所有新符号

转载 作者:行者123 更新时间:2023-12-04 16:54:34 24 4
gpt4 key购买 nike

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

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

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

最佳答案

您收到的评论告诉您如何获取顶级引用,但是只有一种方法可以获取本地 let 绑定(bind),那就是访问 &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 - 如何获取 Clojure 命名空间中的所有新符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46758659/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com