2016-12-22 117 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可能有更精确的答案。 –