Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
了解Clojure';s required:一系列级联必需文件的影响_Clojure - Fatal编程技术网

了解Clojure';s required:一系列级联必需文件的影响

了解Clojure';s required:一系列级联必需文件的影响,clojure,Clojure,我试图在网上和书中找到答案,但我很难弄清楚这到底是如何处理的 让我们以这个场景为例。我有几个文件: a.clj-名称空间:aaa.a b.clj-名称空间:bbb.b c.clj-名称空间:ccc.c d.clj-名称空间:ddd.d 每个文件都定义了一些函数。然后我有一系列必要的陈述: a.clj:[:要求[bbb.b][ccc.c][ddd.d] b.clj:[:要求[ccc.c]] d.clj:[:需要[bbb.b]] 那么我的核心应用程序确实需要[aaa.a] 我的理解是,当我编

我试图在网上和书中找到答案,但我很难弄清楚这到底是如何处理的

让我们以这个场景为例。我有几个文件:

  • a.clj
    -名称空间:
    aaa.a
  • b.clj
    -名称空间:
    bbb.b
  • c.clj
    -名称空间:
    ccc.c
  • d.clj
    -名称空间:
    ddd.d
每个文件都定义了一些函数。然后我有一系列必要的陈述:

  • a.clj
    [:要求[bbb.b][ccc.c][ddd.d]
  • b.clj
    [:要求[ccc.c]]
  • d.clj
    [:需要[bbb.b]]
那么我的核心应用程序确实需要[aaa.a]

我的理解是,当我编译我的核心应用程序时,会发生以下情况:

  • 编译核心文件
  • 编译a.clj
  • 编译b.clj
  • 编译c.clj
  • 编译c.clj(是否跳过它,因为它已经编译了?)
  • 编译d.clj
  • 编译b.clj(是否跳过它,因为它已经编译了?)
  • 关于此设置,我的第一个问题是:

  • 编译器是重新编译了文件
    #5
    #7
    还是跳过了这些文件
  • 然后,假设我在文件
    c.clj
    中定义了一个函数
    foo
    。如果在
    #5
    中文件实际上被重新编译,函数
    foo
    会更改其标识符吗?类似于:

    • 第一次编译时是
      #
    • 第二次编译时将是
      #
      (如果确实是第二次编译)
    我之所以问这些问题,是因为我认为我所经历的是,文件被重新编译,对我的函数的引用也随着项目中对文件的要求而变化

    但是我的直觉告诉我,如果将来需要已经需要的文件,应该跳过它们。然而,看起来这并不是正在发生的事情,所以这个问题的原因是


    然而,真正跟踪这种行为并不是一项简单的任务,这也是为什么我在继续调试之前寻求对此类级联
    require
    语句的影响有更深入的理解。

    require
    使用可选的
    :reload
    :reload all
    键,分别请求要重新编译的ode>ns,或从该文件递归重新编译所有名称空间。如果未指定
    :reload
    :reload all
    ,则不会重新加载名称空间。这可以通过名称空间顶层的简单
    println
    验证(任何定义之外)。更改标识符不应该是问题,因为您的代码不应该引用标识符,它应该引用解析为标识符的变量。即使变量的值更改(反弹),捕获该变量指向的旧对象的函数仍将看到该值(gc无法收集到它,因为他们仍然持有对它的引用)。

    @noisemith非常感谢您的回答。这正是我想要的。有了这些额外的信息,我将继续我的测试。