我试图逃避符号集合,以便我获得变量的集合,但遇到了问题。这是一个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)
答案 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。