有人可以清楚地列出Julia中可用于元编程的各种引用机制,并用最小的例子说明每一个吗?
因此很明显在哪种情况下使用......
据我所见,有:
:(someExpr; maybeMore)
quote; ...expressions... end;
与上述内容几乎相同,仅用于调试目的的行号Expr(:quote, x)
其中according to @totalverb)相当于Meta.quot(x)
此列表是否全面?我错过了任何其他陈述吗?
答案 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)
相同。它没有记载,也没有在任何地方提及,但它是对Base
(https://github.com/JuliaLang/julia/pull/1755)导出的函数的有意识的补充,我还没有看到任何弃用的计划它,所以你可以使用它。