2016-12-11 8 views
8

Czy ktoś mógłby jasno przedstawić różne mechanizmy cytowań dostępne dla metaprogramowania w Julii i zilustrować każdy z nich minimalnym przykładem?Ujednoznacznij różne mechanizmy cytowania w metaprogramowaniu Julii

tak, że jest jasne, które w użyciu, w których sytuacja ...

O ile widzę tam jest:

  • :(someExpr; maybeMore)
  • quote; ...expressions... end; który jest prawie taki sam jak wyżej tylko z numerami wierszy do celów debugowania
  • która (according to @totalverb) jest odpowiednikiem Meta.quot(x)
  • QuoteNode który (according to Jeff Bezanson) "jest używany tylko w wewnętrznej reprezentacji AST, a nie w makrach. To bezpiecznie zignorować chyba pracować na późniejszych etapach kompilator.”

Jest to lista niepełna? Am I brakuje jakichkolwiek alternatywne reprezentacje?

Odpowiedz

7

:... jest domyślnym mechanizmem cytowania. Analizuje wyrazem i zwraca AST.

:x == Symbol("x") 

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

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

eval(:<expr>) powinien powrócić takie same jak tylko <expr> (zakładając <expr> jest poprawnym expressio n w obecnej globalnej przestrzeni)

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

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

quote ... end jest taka sama jak :(begin ... end)


Expr(:quote, x) jest używany do reprezentowania cytaty w cudzysłowie.

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

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

QuoteNode(x) jest podobny do Expr(:quote, x) ale zapobiega interpolacji.

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

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

Oto makro przy wszystkich z nich:

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

Zastosowanie:

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)))) 

edit: Meta.quot(x) rzeczywiście jest taka sama jak Expr(:quote, x). Jest nieudokumentowane i nie jest nigdzie wspominane, ale było świadomym dodatkiem do funkcji eksportowanych przez Base (https://github.com/JuliaLang/julia/pull/1755) i nie widziałem żadnych planów, aby go wycofać, więc możesz z niego korzystać.