2015-11-03 37 views
7

我跟朱莉婭的文件:爲什麼茱莉亞用這種複雜的方式表達這個表達?

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

現在:(a in (1,2,3))==:($(Expr(:in, :a, :((1,2,3))))),爲什麼茱莉亞表示以這種方式表達這又是什麼$究竟意味着什麼?在我看來,$只是評估全球範圍內的下一個表達式。我發現這個文檔不清楚。

+0

請參閱Julia語言** Metaprogramming **文檔:http://docs.julialang.org/en/latest/manual/metaprogramming – SalchiPapa

回答

9

原因:(a in (1,2,3)):($(Expr(...)))是因爲show功能expr的類型的對象(在show.jlshow_unquoted)不理解in綴運營商和回退成一個通用打印格式笨拙顯示。

本質上它與:(1 + 1)相同,只是show_unquoted+識別爲中綴運算符並很好地格式化它。

在任何情況下,:(...)$(...)是逆算子在某種意義上,所以:($(..thing..))酷似..thing..,在這種情況下是Expr(:in,:a,:((1,2,3)))

例如,人們可以在:(1+1)中看到這種奇怪現象。輸出是Expr類型,因爲typeof(:(1+1))==Expr證實。它實際上是Expr(:+,1,1),但在REPL上輸入Expr(:+,1,1)將顯示:($(Expr(:+,1,1)))- Expr類型對象的通用格式化樣式。

修復show.jl來處理in可能是一個很好的變化。但問題是無害的,關心顯示格式。

+6

請注意,至少自從julia'v「0.5.0-dev + 1020 「',':(a in(1,2,3))'正如@Chong Wang所預期的那樣正好顯示:(a in(1,2,3))'。 ' – SalchiPapa

5

$是插補指令,朱莉婭用這個符號來插值字符串以及表達:

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

當你鍵入朱莉婭REPL命令,它會嘗試評估命令,如果代碼不有; char在最後打印結果,所以它與打印函數更相關,即執行命令時會在REPL上看到什麼。
所以,如果你想看到的一個變量一種可能性中,真正的內容是使用dump功能:

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 

這是從上面的測試清楚,這兩個表達式中使用的Expr常見的數據結構headargstyp沒有任何$裏面
現在嘗試評估和打印結果:

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

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

我們已經知道,這兩個命令創建一個相同的結構,但REPL不能顯示的:(a in b)更好的結果的另一Expr結果的Expr,它就是爲什麼有在$裏面。但隨着:(a+b)打交道時,REPL做更多的智能,明白這一點:

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

等於:(a+b)

相關問題