Clojure - 为什么有些命名空间名称不起作用?

时间:2016-02-23 09:54:55

标签: clojure namespaces

我有一个问题,现在已经不见了,我知道是什么修好了但是我不明白为什么。我对clojure很陌生,但在我看来,一些命名空间名称不起作用,而且我不是指那些已被另一个符号占据的明显名称。

我有一个相当简单的项目来实现一个调度程序,它有三个名称空间:schedule.core,schedule.jdate和schedule.validation。

验证命名空间有效,但对于jdate命名空间,我总是收到如下错误:

  

CompilerException java.lang.Exception:No namespace:schedule.jdate,   编译:(时间表/ core.clj:1:1)

错误略有不同,取决于我当前尝试解决问题的方式,但基本上总是意味着相同:没有名称空间的命名空间,在一个实例中,错误甚至表示没有jdate__init(其中我可以相信)并且没有jdate.clj,虽然文件就在文件夹中。

我的命名空间声明和包含内容如下所示:

src/schedule/core.clj: 
(ns schedule.core
  (:gen-class)
  (:require schedule.jdate)
  (:refer schedule.jdate)
  (:require schedule.validation)
  (:refer schedule.validation))

src/schedule/jdate.clj:
(ns schedule.jdate
  (:gen-class)
  (:import java.util.Date)
  (:import java.util.Calendar))

src/schedule/validation.clj: 
(ns schedule.validation
  (:gen-class))

正如我所说,验证命名空间可以正常运行。 最终我没有想法,开始尝试那些不可能有任何关系的东西,除此之外我还将jdate命名空间重命名为scheduleate。行为没有变化。

再过一段时间,我到了"我甚至都没有再尝试了#34;阶段,我将jdate命名空间重命名为" murks" (瑞士的一句话传达了&#34的意思;我需要一把更大的锤子才能使这个工作")并且......它有效。 我认为代码中的其他地方一定有某些东西,我不经意地改变了,突然之间就让它发挥了作用。所以我把名字改回了jdate。它立即停止了工作。

最后,我有点困惑。这里的任何人都可以告诉我a)为什么前两个名字没有用,第三个名字没有用,b)通过扩展名保存用于名称空间的名称,因为我没有期待这种感觉在将来命名时使用扫雷艇。

编辑:问题似乎源于多个密谋来源。首先,我的代码结构需要两个名称空间的双向依赖关系。由于我不太熟悉Clojure的工作原理,所以我假设了一个c风格的包含层次结构,后面包含在同一个树中的文件包含了所有包含它们的内容。我对收到的错误的性质感到有些惊讶,但话说回来,我现在应该知道Clojure错误消息几乎是难以理解的,并且往往具有很强的误导性。 不一致的行为似乎源于我疯狂地尝试重新加载不同的命名空间而不关闭中间的REPL ...即,REPL操作的结果并不总是反映代码的状态。

哦,这是一个相当繁琐的教训" Clojure真的讨厌循环包含"但我认为这是我现在学到的。

0 个答案:

没有答案