2016-12-22 146 views
1

至於我可以從文檔和網絡上幾個職位,聲明包含什麼?

include("myfile.jl") 

理解只是需要代碼myfile.jl並將其粘貼在調用文件(或控制檯),取代包含聲明的行。

如果我錯了,請糾正我。我剛剛開始與朱莉婭。但是,我也看到了朱莉婭的創造者之一的評論:

"include works in the dynamically-current module, not the lexically-current one. 
It is really a load-time function, not a run-time one." 

是什麼動態電流和詞法電流之間的區別?

回答

0

這意味着當您的應用程序啓動時,您將立即使用此代碼代替include。 「包含」將不會在運行應用程序中。這意味着如果你使用include,你的應用程序在加載的時候可能會稍微加載一些(它不是顯而易見的,我提到它是爲了更好的理解),但是它會在代碼運行時使用include來運行。加載時間在應用程序開始運行之前。

+2

我覺得這個答案有點困惑。將試圖澄清@ ChrisRackaucakas的答案。 – StefanKarpinski

6

這不是一個函數調用,因爲如果myfile.jl只是a = 2和你做include("myfile.jl"),那麼你可以在REPL檢查a = 2。在a將被定義在不同範圍內的功能中,然後在功能結束後擦除。所以這是一個明顯的行爲差異。這裏有一個例子REPL會話演示的區別:

julia> a 
ERROR: UndefVarError: a not defined 

julia> function incl(file) 
      a = "not 2" 
      include(file) 
      @show Main.a 
      @show a 
     end 
incl (generic function with 1 method) 

julia> incl("myfile.jl") 
Main.a = 2 
a = "not 2" 
"not 2" 

julia> a 
2 

這就是他們所說的「動態流」與「詞彙電流」。從詞彙的角度講,函數運行在自己的範圍內,只能從函數的實際代碼中訪問 - 沒有其他方法可以訪問或更改局部變量。 include始終在當前全局範圍內運行,即使從函數內部調用時也是如此。 Julia的eval函數的行爲類似 - 您只能看到或更改局部變量eval僅限於全局變量。

+0

我仍然感到困惑,因爲Josh Watzman在http://stackoverflow.com/questions/22394089/static-lexical-scoping-vs-dynamic-scoping-pseudocode中的詳細答案似乎是說「動態」是指運行時(這取決於堆棧上的內容),而在我的帖子中引用的評論則認爲include是一個加載時函數,而不是運行時函數。在編譯開始之前,include語句會在源代碼中替換它自己(加載時函數),還是等待直到執行到達該行,然後才執行替換代碼(運行時函數)? – Soldalma

+2

我已經添加了一個例子,並且顯着地編輯了答案(希望沒關係,Chris)。希望能夠澄清一些情況。 – StefanKarpinski

+0

編輯很棒。我也學到了。它使命名方案有意義。爲了擴大Soldalma(和我自己),Julia中的函數因爲它們被編譯而不是動態的。 Julia中的動態範圍是一個模塊的全局範圍:這是一個沒有集合代碼集的範圍(Julia中的函數通過分派進行專門化,所以它可能有很多不同的含義,但都是固定的) 。因此,在當前的全局/動態/模塊範圍內包含運行。我明白模塊範圍是動態的,因爲REPL必須運行在一個('Main')中,但Stefan可能有更精確的答案。 –