消除Julia元编程中的各种引用机制的歧义

时间:2016-12-11 17:35:40

标签: metaprogramming julia quoting

有人可以清楚地列出Julia中可用于元编程的各种引用机制,并用最小的例子说明每一个吗?

因此很明显在哪种情况下使用......

据我所见,有:

  • :(someExpr; maybeMore)
  • quote; ...expressions... end;与上述内容几乎相同,仅用于调试目的的行号
  • Expr(:quote, x)其中according to @totalverb)相当于Meta.quot(x)
  • QuoteNode(according to Jeff Bezanson"仅用于内部AST表示,而不是宏。除非您在编译器的后续阶段工作,否则可以安全忽略。"

此列表是否全面?我错过了任何其他陈述吗?

1 个答案:

答案 0 :(得分:8)

:...是默认的引用机制。它解析表达式并返回AST。

:x == Symbol("x")

:(x + y) == Expr(:call, :+, :x, :y)

:(x; y; z) == Expr(:block, :x, :y, :z)

eval(:<expr>)应该返回与<expr>相同的内容(假设<expr>是当前全局空间中的有效表达式)

eval(:(1 + 2)) == 1 + 2

eval(:(let x=1; x + 1 end)) == let x=1; x + 1 end

quote ... end:(begin ... end)

相同

Expr(:quote, x)用于表示引号内的引号。

Expr(:quote, :(x + y)) == :(:(x + y))

Expr(:quote, Expr(:$, :x)) == :(:($x))

QuoteNode(x)Expr(:quote, x)类似,但它会阻止插值。

eval(Expr(:quote, Expr(:$, 1))) == 1

eval(QuoteNode(Expr(:$, 1))) == Expr(:$, 1)

这是一个使用所有这些宏的宏:

macro quoted(expression)
    quote
        println("received expression: :(", $(QuoteNode(expression)), ")")
        $(Expr(:quote, expression))
    end
end

用法:

julia> x = 1
1

julia> @quoted $x + 1
received expression: :($(Expr(:$, :x)) + 1)
:(1 + 1)

julia> @quoted :(x + 1)
received expression: :($(Expr(:quote, :(x + 1))))
:($(Expr(:quote, :(x + 1))))

修改Meta.quot(x)确实与Expr(:quote, x)相同。它没有记载,也没有在任何地方提及,但它是对Basehttps://github.com/JuliaLang/julia/pull/1755)导出的函数的有意识的补充,我还没有看到任何弃用的计划它,所以你可以使用它。