使自定义宏支持 Julia 自带的表达式插值

假设已有宏 f(ex::Expr)

macro f(ex::Expr)
    dump(ex)
end

以及变量 x = :(1 + 1),怎样可以使之支持插值,也就是使得 @f $x 等价于 @f 1 + 1 呢?

一种启发自 @eval 宏的实现方式是将宏 f 原本的实现分离到一个函数中,插值则通过宏 f 来实现,即:

macro f(ex::Expr)
    return :($(@__MODULE__).f($__module__, $(Expr(:quote, ex))))
end

function f(__module__::Module, ex::Expr)
    dump(ex)
end

这种方式也支持局部变量的插值,若有其他的实现方式可以写在下面。

1 个赞