【发布时间】:2017-07-24 14:02:31
【问题描述】:
使用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,但由于这是宏扩展的,我永远无法捕获声明它的名称和ns - 相反,我得到了宏扩展:
: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)
【问题讨论】:
-
您找到解决方案了吗?我有完全相同的问题。
标签: dynamic clojure macros analyzer