在朱

2015-10-18 79 views
2

動態和靜態變量之間的區分在朱,有像isdynamic()任何函數來顯示給定的變量是否是「動態」或「靜態」類型的?例如,我假設ab在下面的代碼中分別是動態和靜態變量,其中我的意思是「動態」表示變量可以表示任何數據類型。如果我運行@code_warntype,ab被示出爲分別AnyInt64,但我想知道是否能夠顯示與一些功能的實際內部表示。這是不可能的,因爲內部表示的確定取決於整個函數(加上變量取決於它的實際參數的類型),而不是代碼直到調用isdynamic(a)在朱

function test() 
    a = 1 
    b::Int = 1 
    @show typeof(a) # Int64 
    @show typeof(b) # Int64 

    a = 3.0 
    b = 3.0 
    @show typeof(a) # Float64 
    @show typeof(b) # Int64 

    a = 3.2  # okay 
    # b = 3.2 # InexactError 
end 

test() 
# @code_warntype test() # after eliminating @show... statements 
+1

你可能想看看http://stackoverflow.com/questions/28078089/is-julia-dynamically-typed。 – StefanKarpinski

回答

3

OK,儘量把下面的代碼test函數體:

function test() 
: 
: 
    vinfo = code_lowered(test,())[1].args[2][1] 
    aind = findfirst(x->x[1]==:a,vinfo) 
    bind = findfirst(x->x[1]==:b,vinfo) 
    if aind > 0 
     println("inference-type of a = $(vinfo[aind][2])") 
    end 
    if bind > 0 
     println("inference-type of b = $(vinfo[bind][2])") 
    end 
end 

和運行test()。這應該顯示推理引擎計算並將其存儲在內部時變量之間的差異。通過查看代碼來修補此問題,所以也許更多內部專家的人有更好的答案。

對於像OP問的isdynamic功能,我們可以有:

function isdynamic(f,args,symbol) 
    vi=code_lowered(f,args)[1].args[2][1] 
    (ind=findfirst(x->x[1]==symbol,vi))>0 ? vi[ind][2]==:Any : false 
end 
isdynamic(test,(),:a) # true 
isdynamic(test,(),:b) # false 
+0

當然,當函數已經被編譯時,額外的代碼可以在任何地方運行(來自REPL)。 –

+1

非常有趣,非常感謝:)我玩了code_lowered()一段時間。儘管獲得的淨信息可能與@code_warntype相同,但我認爲能夠從函數內部知道內部類型是很有趣的。我嘗試添加一個像'test(s)'這樣的參數,用s定義一個參數,並且從test()內部調用isdynamic()作爲isdynamic(test,(typeof(s),),:a)',然後它給真實。所以人們可以在檢查程序中「嵌入」檢查代碼:) – roygvib