Julia 对符号集合进行转义

Julia 对符号集合进行转义,julia,metaprogramming,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

我试图避开一组符号,这样我就得到了一组变量,但遇到了一些问题。这里有一个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)

调用
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))
但您也可以在列表拼接(如Lisp中的
,@
)有意义的上下文中使用以下unquote语法:

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…)
。我最近在读别人的代码时偶然发现了它。但在当前的“最新”文档中,它被称为