假设已有宏 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
这种方式也支持局部变量的插值,若有其他的实现方式可以写在下面。