有人可以清楚地说明在Julia中可用于元编程的各种报价机制,并用一个最小的例子来说明每个报价机制吗?
这样就很清楚在哪种情况下使用哪个...
据我所知:
:(someExpr; maybeMore)
quote; ...expressions... end;
与上面的几乎相同,只是行号用于调试目的Expr(:quote, x)
(according to @totalverb)等于Meta.quot(x)
这份 list 是否全面?我会错过任何其他表示形式吗?
最佳答案
:...
是默认的报价机制。它解析一个表达式并返回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)
相同。它没有记录,也没有在任何地方提及,但是它是对Base
(https://github.com/JuliaLang/julia/pull/1755)导出的函数的有意识的补充,而且我还没有看到任何弃用它的计划,因此可以使用它。
关于metaprogramming - 消除Julia元编程中的各种引用机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41089019/