2015-11-03 6 views
7

folgte ich die Dokumentation von julia:Warum drückt Julia diesen Ausdruck auf diese komplexe Art aus?

julia> :(a in (1,2,3)) 
:($(Expr(:in, :a, :((1,2,3))))) 

Nun, da :(a in (1,2,3))==:($(Expr(:in, :a, :((1,2,3))))), warum julia diesen Ausdruck auf diese Weise ausdrücken Und was bedeutet $ genau bedeutet? Es scheint mir, dass $ gerade den nächsten Ausdruck in einem globalen Gültigkeitsbereich auswertet. Ich fand die Dokumentation darüber unklar.

+0

Bitte beachten Sie die Julia Sprache ** Metaprogrammierung ** Dokumentation: http://docs.juliallang.org/en/latest/manual/metaprogramming – SalchiPapa

Antwort

9

Der Grund :(a in (1,2,3)) ist ungeschickt angezeigt, wie :($(Expr(...))) ist, weil die show Funktion für Expr Objekte eingegeben (show_unquoted in show.jl) nicht verstehen, das in Infixoperator und Fallbacks in ein allgemeines Druckformat.

Im Wesentlichen ist es das gleiche wie :(1 + 1) mit der Ausnahme, dass show_unquoted+ als Infix-Operator erkennt und es schön formatiert.

In jedem Fall :(...) und $(...) sind inverse Operatoren in gewissem Sinne, so :($(..thing..)) ist genau wie ..thing.., die in diesem Fall Expr(:in,:a,:((1,2,3))) ist.

Man kann diese Seltsamkeit in :(1+1) zum Beispiel sehen. Die Ausgabe ist vom Expr-Typ, wie typeof(:(1+1))==Expr bestätigt. Es ist eigentlich Expr(:+,1,1), aber die Eingabe Expr(:+,1,1) auf der REPL zeigt :($(Expr(:+,1,1))) - den generischen Formatierungsstil von Expr getippten Objekten.

Fixing show.jl zu handhaben in könnte eine nette Abwechslung sein. Das Problem ist jedoch harmlos und betrifft die Formatierung der Anzeige.

+6

Beachten Sie, dass mindestens seit julia 'v" 0.5.0-dev + 1020 "', ': (a in (1, 2, 3))" zeigt genau ": (a in (1,2,3))', wie @Chong Wang erwartet. ' – SalchiPapa

5

$ ist die Interpolation Befehl, Julia diese Notation verwenden Strings als Ausdruck als auch zu interpolieren:

julia> a=1; 
julia> "test $a" # => "test 1" 
julia> :(b+$a) # => :(b + 1) 

Wenn Sie einen Befehl in Julia REPL geben, versucht er den Befehl auswertet und wenn der Code nicht have ; char am Ende druckt das Ergebnis, so ist es mehr mit Druckfunktionen, dass was auf REPL gesehen wird, wenn ein Befehl ausgeführt wird.
so, wenn Sie den wirklichen Inhalt einer Variablen einer Möglichkeit sehen wollen, ist dump Funktion zu verwenden:

julia> dump(:(a+b)) 
Expr 
    head: Symbol call 
    args: Array(Any,(3,)) 
    1: Symbol + 
    2: Symbol a 
    3: Symbol b 
    typ: Any 

julia> dump(:(a in b)) 
Expr 
    head: Symbol in 
    args: Array(Any,(2,)) 
    1: Symbol a 
    2: Symbol b 
    typ: Any 

Es ist klar, von oben Tests, dass beide Ausdrücke eine gemeinsame Datenstruktur von Expr mit head, args verwenden und typohne $ innerhalb.
Jetzt versuchen und Ergebnisdruck zu bewerten:

julia> :(a in b) 
:($(Expr(:in, :a, :b))) 

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

Wir wissen bereits, dass beide die gleiche Struktur erstellen Befehl aber REPL kann das Ergebnis des :(a in b) besser nicht zeigen, dass ein Expr von Ergebnis einer anderen Expr und es ist, warum es in einem $ innen. Aber wenn sie mit :(a+b) tun haben, tun REPL intelligenter und versteht, dass dies:

Expr 
    head: Symbol call 
    args: Array(Any,(3,)) 
    1: Symbol + 
    2: Symbol a 
    3: Symbol b 
    typ: Any 

zu :(a+b) gleich ist.

Verwandte Themen