转义符号集合

时间:2018-03-17 14:17:13

标签: julia metaprogramming

我试图逃避符号集合,以便我获得变量的集合,但遇到了问题。这是一个MWE:

macro escape_all(x...)
    :($(esc.(x))...)
end
x = 1
y = 2
z = 3
macroexpand(:(@escape_all x y z))

返回

:(((:($(Expr(:escape, :x))), :($(Expr(:escape, :y))), :($(Expr(:escape, :z))))...,))

但是我要找回来的只是

(x,y,z)

1 个答案:

答案 0 :(得分:3)

明确调用Expr有效:

julia> macro escape_all(xs...)
           Expr(:tuple, esc.(xs)...)
       end
@escape_all (macro with 1 method)

julia> @macroexpand @escape_all x y z
:((x, y, z))

但是你也可以在一个上下文中使用下面的unquote语法,其中列表拼接(我猜Lisp中的,@)是有道理的:

julia> macro escape_list(xs...)
           :([$(esc.(xs)...)])
       end
@escape_list (macro with 1 method)

julia> macro escape_f(xs...)
           :(f($(esc.(xs)...)))
       end
@escape_f (macro with 1 method)

julia> @macroexpand @escape_list x y z
:([x, y, z])

julia> @macroexpand @escape_f x y z
:((Main.f)(x, y, z))

有趣的是,我从未在任何地方看到$(x...)被谈论过。我最近偶然发现了某人的代码。但它在当前的“最新”文档中被提及为splatting interpolation