julia - 转义符号集合

标签 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)

最佳答案

调用 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 中的 ,@,我猜)有意义的上下文中使用以下不加引号的语法:
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 .

关于julia - 转义符号集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49337902/

相关文章:

julia - 如何使用 Plots.jl 在图像上绘图?

julia - 在 Julia 的一行中定义多个相同类型的变量?

ruby - 变量如何绑定(bind)到 define_method 的主体?

ruby - 从 Ruby 程序执行 Ruby 程序的最佳方式是什么?

clojure - 如果在 Lisp 中读取、编译和运行时没有区别,有人能给我一些直观的例子吗?

python-3.x - Julia 的 reshape

module - 在 Julia 中更改 REPL 模块/命名空间

c++ - 元编程和运行时代码生成

scala - 元编程在scala中解析json

Julia 数据帧 : Problems with Split-Apply-Combine strategy