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