2

我对 Enclojure REPL 和使用它的 clojure 模块有疑问。Load/Change REPL to file/ns 适用于隔离的 clojure 文件,但会中断一个文件,该文件引用了我尝试从我的项目中使用的另一个 clojure 文件。

以下是具体步骤:

  • 创建一个新项目。
  • 创建一个 clojure 模块 foobar.clj(命名空间 com.acme.foobar)
  • 在 foobar.clj 中定义一个返回值的函数:

    (ns com.acme.foobar (:use com.acme.othermodule))

    (defn myfunc1 [] "a")

  • 打开 Netbeans IDE REPL

  • 从 foobar.clj 的上下文菜单中选择:

    • 将 REPL 更改为文件/ns
    • 加载
  • 从 REPL 调用 (myfunc1) 函数。这工作得很好:

    com.acme.foobar=> (myfunc1) "a"

当我尝试从 foobar 引用其他文件时,问题就开始了。这就是我所做的:

  • 创建一个新的 clojure 模块 othermodule.clj

    (ns com.acme.othermodule)

    (defn from othermodule [] "b")

  • 现在尝试从 foobar.clj 调用它:

    (defn myfunc2 [] (fromothermodule))

  • 从 othermodule.clj 的上下文菜单中,我选择:

    • 将 REPL 更改为文件/ns
    • 加载

为了让 REPL 意识到它应该能够运行新模块。

  • 我对现在引用 othermodule.clj 的 foobar.clj 做同样的事情,但我得到:

CompilerException java.io.FileNotFoundException: 无法在类路径上找到 com/acme/othermodule__init.class 或 com/acme/othermodule.clj: (NO_SOURCE_FILE:50) com.acme.foobar=>

此错误消息来自“将 REPL 更改为文件/ns”和“加载”

我错过了什么?我应该做一些其他的技巧来实现这一点吗?即使是 Run->Clean and Build the main project 的绝望措施也无济于事(这当然会使 REPL 业务非常痛苦)。

我正在使用 NetBeans 6.7.1 和 enclojure-plugin-2009-11-3.nbm。

4

2 回答 2

2

从谷歌组的Eric Thorsen那里得到了正确的解决方案:

从窗口菜单创建 REPL 有三种方法。不要使用其中任何一个,而是右键单击项目并“启动项目 REPL”。现在相应地设置了路径。

于 2009-11-04T18:52:49.583 回答
1

我的第一个建议是从 NetBeans/Enclojure 迁移到 IDEA/La Clojure。JetBrains 最近创建了他们的 IDE 的开源版本,并且 Clojure 插件在其中运行良好。发现这一点后,我放弃了 NetBeans 和 Enclojure。我发现在 La Clojure 工作很愉快,但当然你的里程可能会有所不同。

当我在 NetBeans 中执行此操作时,我似乎记得 Enclojure 源代码驻留在一个名为“lib”的子目录中。我想我通过摆弄要加载的文件名上的目录前缀解决了类似的问题。可能类似于“../lib/YourName”。我通过反复试验来解决这个问题,所以我无法关联确切的规则和语法。

有两件事可能会有所帮助:

  • 你可以运行类似(println (System/getProperty "java.user.dir"))的东西来找出 Clojure 认为它是从哪里执行的。

  • 您可以像我一样开始使用绝对路径,直到找到正确的目录名称。类似"/home/carl/NetbeansProjects/MyProject/lib/myfile.clj"的东西。

于 2009-11-04T16:33:56.720 回答