【问题标题】:What exactly does include do?include 到底是做什么的?
【发布时间】:2017-05-08 09:40:00
【问题描述】:

据我从文档和网络上的几篇帖子中了解到,声明

include("myfile.jl")

只需将 myfile.jl 中的代码粘贴到调用文件(或控制台中),用包含语句替换该行。

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

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

动态电流和词法电流有什么区别?

【问题讨论】:

    标签: julia


    【解决方案1】:

    这不是函数调用,因为如果 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 看到或更改局部变量,只有全局变量。

    【讨论】:

    • 我仍然感到困惑,因为 Josh Watzman 在stackoverflow.com/questions/22394089/… 中的详细回答似乎说“动态”是指运行时(这取决于堆栈上的内容),而我引用的评论在我的帖子中说 include 是加载时函数,而不是运行时函数。 include 语句是在编译开始之前替换源代码中的自身(加载时函数)还是等到执行到该行才执行替换代码(运行时函数)?
    • 我添加了一个示例并显着编辑了答案(希望没关系,克里斯)。希望这能稍微澄清一下情况。
    • 编辑很棒。我也学会了。它使命名方案有意义。为了扩展 Soldalma(和我自己),Julia 中的函数不是动态的,因为它们是编译的。 Julia 中的动态作用域是模块的全局作用域:这是不只是一组组装代码的作用域(Julia 中的函数专门通过调度,因此它可能有许多不同的含义,但都是固定的) .因此包括在当前全局/动态/模块范围内运行。我知道模块范围是动态的,因为 REPL 必须在一个 (Main) 中运行,但 Stefan 可能有一个更精致的答案。
    • 另外应该注意的是问题的答案:“如果我想将 Julia 代码包含到词法范围中(直接到函数中)怎么办?”?你可以通过宏来做到这一点。 The @def macro here 定义了用于执行此操作的宏:编译器复制/粘贴(该示例定义了 @test,它粘贴代码 a=2,但任意表达式都有效)。虽然我使用了一点,但这不是惯用的 Julia(并且违反了一些编码原则),所以我将把它埋在这个评论中。
    【解决方案2】:

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

    【讨论】:

    • 我认为这个答案有点混乱。将尝试澄清@ChrisRackaucakas 的答案。
    猜你喜欢
    • 2015-08-06
    • 2013-09-02
    • 2014-01-02
    • 2013-10-10
    • 2022-01-20
    • 2012-10-17
    • 2017-06-15
    • 2011-05-20
    • 2010-11-13
    相关资源
    最近更新 更多