:...
是默認的引用機制。它解析表達式並返回AST。
:x == Symbol("x")
:(x + y) == Expr(:call, :+, :x, :y)
:(x; y; z) == Expr(:block, :x, :y, :z)
eval(:<expr>)
應返回相同只是<expr>
(假設<expr>
是有效expressio n的當前全球空間)
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)導出的函數的一個有意識的補充,我還沒有看到任何計劃將其棄用,因此您可以使用它。