是否可以使用宏获取clojurescript文件的文件名和行号?

时间:2013-12-03 13:20:44

标签: clojurescript

我正在寻找一种方法,使用宏从cljs分析器中获取特定代码段的文件名和行号信息。这可能吗?

(page-info) => line: 1, file: test.clj

1 个答案:

答案 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的元数据的最佳方式。