Julia 对符号集合进行转义
我试图避开一组符号,这样我就得到了一组变量,但遇到了一些问题。这里有一个MWE: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
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…)
。我最近在读别人的代码时偶然发现了它。但在当前的“最新”文档中,它被称为