转义符号集合
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.
我正在尝试转义一组符号,这样我就可以得到一组变量,但是 运行 遇到了问题。这是一个 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.