我跟朱莉婭的文件:爲什麼茱莉亞用這種複雜的方式表達這個表達?
julia> :(a in (1,2,3))
:($(Expr(:in, :a, :((1,2,3)))))
現在:(a in (1,2,3))==:($(Expr(:in, :a, :((1,2,3)))))
,爲什麼茱莉亞表示以這種方式表達這又是什麼$
究竟意味着什麼?在我看來,$
只是評估全球範圍內的下一個表達式。我發現這個文檔不清楚。
我跟朱莉婭的文件:爲什麼茱莉亞用這種複雜的方式表達這個表達?
julia> :(a in (1,2,3))
:($(Expr(:in, :a, :((1,2,3)))))
現在:(a in (1,2,3))==:($(Expr(:in, :a, :((1,2,3)))))
,爲什麼茱莉亞表示以這種方式表達這又是什麼$
究竟意味着什麼?在我看來,$
只是評估全球範圍內的下一個表達式。我發現這個文檔不清楚。
原因:(a in (1,2,3))
爲:($(Expr(...)))
是因爲show
功能expr的類型的對象(在show.jl
show_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
可能是一個很好的變化。但問題是無害的,關心顯示格式。
請注意,至少自從julia'v「0.5.0-dev + 1020 「',':(a in(1,2,3))'正如@Chong Wang所預期的那樣正好顯示:(a in(1,2,3))'。 ' – SalchiPapa
$
是插補指令,朱莉婭用這個符號來插值字符串以及表達:
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
常見的數據結構head
,args
和typ
沒有任何$
裏面。
現在嘗試評估和打印結果:
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)
。
請參閱Julia語言** Metaprogramming **文檔:http://docs.julialang.org/en/latest/manual/metaprogramming – SalchiPapa