我正在寻找一种方法,使用宏从cljs分析器中获取特定代码段的文件名和行号信息。这可能吗?
即
(page-info) => line: 1, file: test.clj
答案 0 :(得分:2)
是的!使用标准的clojure宏工具,加上一点cljs.analyzer
魔法,实际上很容易做到这一点:
例如,这是一个显式添加元数据到clojurescript表达式的宏(只要它支持元数据):
(defmacro add-meta [expr]
(let [namespace {:namespace (name cljs.analyzer/*cljs-ns*)}
source-details (meta &form)]
`(with-meta ~expr '~(merge namespace source-details))))
在clojurescript文件中,您可以使用它从表单中提取元数据(只要它支持元数据),例如。
(meta (add-meta {:foo 'bar})) => {:namespace my.namespace :line 1 :column 4}
这个宏依赖于两个信息来源:
cljs.analyzer/*cljs-ns*
是一个动态绑定的var,它包含clojurescript代码宏扩展期间的当前命名空间。&form
是宏的主体中可用的特殊变量,它允许访问导致调用宏的表单。这是访问宏关于call-site的元数据的最佳方式。