如何在使用 tools.analyzer.jvm/analyze
创建ast时避免扩展宏?
以下是我目前正在收集的信息示例:(函数名称映射到依赖项集合的映射)
{some-function
#{{:name load-order-ns-file-maps, :ns #namespace[clj-graph.core]}
{:name *logger-factory*, :ns #namespace[clojure.tools.logging]}
{:name analyze, :ns #namespace[clojure.tools.analyzer.jvm]}
{:name make-dir-tracker, :ns #namespace[clj-graph.core]}
{:name enabled?, :ns #namespace[clojure.tools.logging.impl]}
{:name read-all, :ns #namespace[clj-graph.core]}
{:name get-logger, :ns #namespace[clojure.tools.logging.impl]}
{:name traverse-expr, :ns #namespace[clj-graph.core]}
{:name log*, :ns #namespace[clojure.tools.logging]}
{:name track-reload,
:ns #namespace[clojure.tools.namespace.reload]}
{:name examine-form, :ns #namespace[clj-graph.core]}}}
实际代码调用了
log/info
,但由于这是宏展开的,我永远无法捕获它被声明的名称和命名空间 - 相反,我得到的是宏展开的结果::name *logger-factory*, :ns #namespace[clojure.tools.logging]
:name enabled?, :ns #namespace[clojure.tools.logging.impl]
:name get-logger, :ns #namespace[clojure.tools.logging.impl]
:name log*, :ns #namespace[clojure.tools.logging]
作为一个正在构建依赖图的人,理想情况下我只想找到端点,即:name info :ns #namespace[clojure.tools.logging]
。
阅读analyzer.jvm/analyze
的文档时,它给出了一个示例:
(analyze form env {:bindings {#'ana/macroexpand-1 my-mexpand-1}})
但是当我尝试这样做时,即:
(defn ^:dynamic my-expand-1 [form] form)
(ana/analyze
'(defn prnt [xs] (my-pre-defined-macro xs))
(ana/empty-env)
{:bindings {#'ana/macroexpand-1 my-expand-1}})
我得到了一个错误。
IllegalStateException Can't dynamically bind non-dynamic var:
clojure.tools.analyzer.jvm/macroexpand-1 clojure.lang.Var.pushThreadBindings (Var.java:320)