2016-09-28 4 views
5

Ich möchte einen Konstruktor mit Schlüsselwortargumenten innerhalb eines Makros erstellen, und das erste Schlüsselwortargument muss für einen Ausdruck sein. Ich habe Schwierigkeiten, diesen Ausdruck in den Ausdruck zu bringen. Hier ist was ich meine. Angenommen, ich habe einen TypEinen Ausdruck in einen Ausdruck interpolieren

type Test 
    ex 
end 

, der einen Ausdruck enthält. Ich möchte einen Konstruktor erstellen, wobei origex = :(a * b) der Standard aus einem Schlüsselwortargument ist. Ich habe versucht,

@eval :(Test(ex=$origex) = Test(origex)) 

Aber wenn man den Ausdruck suchen, die macht:

Test(ex=a * b) = begin # console, line 1: 
    Test(origex) 
end 

Sie sehen, dass es nicht funktionieren wird, weil die a*b noch ein Ausdruck sein muss. Also habe ich versucht

@eval :(Test(ex=:($origex)) = Test(origex)) 

aber dies hat den ungeraden Ausdruck

Test(ex=$(Expr(:quote, :($(Expr(:$, :origex)))))) = begin # console, line 1: 
    Test(origex) 
end 

die auch wird nicht eval. Stattdessen muss ich

als Ausdruck zu Eval bekommen, aber ich weiß nicht, wie man diesen Ausdruck in einen Ausdruck bekommt.

Antwort

6

Ich denke, das Folgende ist, was Sie wollen. Sie scheinen ein paar Fehler gehabt zu haben:

julia> type Test 
     ex::Expr 
     end 

julia> orig_ex = :(a + b) 
:(a + b) 

julia> new_ex = Meta.quot(orig_ex) 
:($(Expr(:quote, :(a + b)))) 

julia> code = :(Test(; ex=$new_ex) = Test(ex)) 
:(Test(; ex=$(Expr(:quote, :(a + b)))) = begin # REPL[4], line 1: 
      Test(ex) 
     end) 

julia> eval(code) 
Test 

julia> Test() 
Test(:(a + b)) 
+1

Danke. Das hat wunderbar funktioniert. Was genau ist "Meta", und warum ist es anders als: (orig_ex)? –

+1

@ChrisRackauckas 'Meta.quot (ex)' ist einfach 'Expr (: Zitat, ex)': 'julia> ex =: (a + b); @assert Meta.quot (ex) == Expr (: quote, ex) ' – SalchiPapa

+0

Meta.quot fügt eine weitere Quotierungsstufe hinzu. Wie Sie herausgefunden haben, ist beim Interpolieren die Verwendung von: (orig_ex) nicht ausreichend, um das Zitat zu behalten. Diese Dinge sind ziemlich schwierig, nach meiner Erfahrung richtig zu machen! –

Verwandte Themen