Julia 你到底做什么?

Julia 你到底做什么?,julia,Julia,据我从文档和网上的几篇帖子中所了解,这份声明 include("myfile.jl") 只需获取myfile.jl中的代码并将其粘贴到调用文件(或控制台)上,用include语句替换该行 如果我错了,请纠正我。我只是从朱莉娅开始。然而,我也看到了朱莉娅的一位创作者的以下评论: "include works in the dynamically-current module, not the lexically-current one. It is really a load-time func

据我从文档和网上的几篇帖子中所了解,这份声明

include("myfile.jl")
只需获取myfile.jl中的代码并将其粘贴到调用文件(或控制台)上,用include语句替换该行

如果我错了,请纠正我。我只是从朱莉娅开始。然而,我也看到了朱莉娅的一位创作者的以下评论:

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

动态最新和词汇最新之间有什么区别?

这意味着您将在应用程序启动时立即使用此代码代替include。“Include”将不会出现在正在运行的应用程序中。这意味着,如果使用include,应用程序在加载时可能会稍微慢一点(不明显,我提到它是为了更好地理解),但它将在include被代码替换的情况下运行。加载时间是在应用程序开始运行之前。

这不是函数调用,因为如果
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

这就是他们所说的“动态流动”与“词汇流动”的意思。从词汇上讲,函数在自己的作用域中运行,而这个作用域只能从函数的实际代码中访问——没有其他方法可以访问或更改局部变量<代码>包含始终在当前全局范围内运行,即使从函数内部调用。Julia的
eval
函数的行为类似–您无法看到或更改只有全局变量的
eval
局部变量。

我仍然感到困惑,因为Josh Watzman在年的详细回答似乎说“动态”指的是运行时(取决于堆栈上的内容)虽然我在帖子中引用的评论说include是一个加载时函数,而不是运行时函数。include语句是在编译开始之前在源代码中替换自身(加载时函数),还是等到执行到那一行,然后才执行替换代码(运行时函数)?我添加了一个示例,并对答案进行了显著的编辑(希望没问题,Chris)。希望这能澄清一点情况。编辑很棒。我也学会了。这使得命名方案有意义。为了扩展Soldalma(和我自己),Julia中的函数不是动态的,因为它们是编译的。Julia中的动态范围是模块的全局范围:这是一个范围,它不只是一组汇编代码(Julia中的函数通过分派进行专门化,因此它可能有许多不同的含义,但都是固定的)。因此,包括当前全局/动态/模块范围内的运行。我知道模块作用域是动态的,因为REPL必须在一个(
Main
)中运行,但是Stefan可能有一个更精确的答案。此外,还应该注意的是问题的答案:“如果我想将Julia代码包含到词法作用域(直接包含到函数中)”?您可以通过宏来实现这一点。定义用于执行此操作的宏:编译器复制/粘贴(示例定义了粘贴代码
a=2
,但任意表达式可以工作的
@test
)。虽然我用了一点,但这不是惯用的Julia(并且违反了一些编码原则),所以我将把它隐藏在这篇评论中。我认为这个答案有点混乱。将试图澄清@ChrisRackaucakas的答案。