2016-12-11 25 views
8

是否有人可以清楚地列出Julia中可用於元編程的各種引用機制,並用一個最小示例來說明每個引用機制?消除Julia元編程中各種引用機制的歧義

所以這非常清晰,在什麼情況下使用?

據我所看到的有:

  • :(someExpr; maybeMore)
  • quote; ...expressions... end;這幾乎是一樣的上述僅用於調試目的的行號
  • Expr(:quote, x)其中(according to @totalverb)等效於Meta.quot(x)
  • QuoteNode其中(according to Jeff Bezanson「僅用於內部AST表示,而不是宏。這是安全地忽略,除非你對編譯器的後期工作。」

是這個名單是否全面?我缺少了任何替代表示?

回答

7

:...是默認的引用機制。它解析表達式並返回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)。它沒有文檔記錄,在任何地方都沒有提到,但它是Basehttps://github.com/JuliaLang/julia/pull/1755)導出的函數的一個有意識的補充,我還沒有看到任何計劃將其棄用,因此您可以使用它。

相關問題