转义符号集合

Escaping a collection of symbols

我正在尝试转义一组符号,这样我就可以得到一组变量,但是 运行 遇到了问题。这是一个 MWE:

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

这个returns

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

但我要找的 return 只是

(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))

但是您也可以在 list-splicing(我猜像 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...) 在任何地方被谈论。我最近在阅读某人的代码时偶然发现了它。但它在当前 "latest" 文档中提到为 splatting interpolation.