如何在评估Clojure宏时获取调用方的源码位置?
在Clojure宏中获取调用方的源码位置
要在Clojure宏内部拿到调用该宏的代码所在的源文件、行号和列号,直接用宏的隐式参数&form就能搞定——它能提供当前宏调用的语法对象,从中提取位置元数据即可。
示例代码如下:
(defmacro my-macro [] (let [{:keys [file line column]} (meta &form)] `(prn (str "调用位置:文件 " ~file ",行号 " ~line ",列号 " ~column))))
简单说明
&form是Clojure宏自带的隐式参数,代表当前宏调用的语法形式- 通过
(meta &form)可以获取这个语法形式的元数据,里面包含:file(源文件路径)、:line(行号)、:column(列号)这些位置信息 - 把这些信息注入到宏展开后的代码里,调用宏时就会打印出调用方的具体位置
比如你在demo.clj的第8行调用这个宏:
(my-macro)
运行后会输出类似这样的内容:"调用位置:文件 demo.clj,行号 8,列号 1"
内容的提问来源于stack exchange,提问作者Witek
相关产品推荐
相关产品推荐

