我有一个Enclojure REPL的问题,并使用它的clojure模块 . 文件/ ns的加载/更改REPL与隔离的clojure文件一起工作正常,但是打破了一个文件,该文件引用了我尝试从我的项目中使用的另一个clojure文件 .
以下是确切的步骤:
-
创建一个新项目 .
-
创建一个clojure模块foobar.clj(namespace com.acme.foobar)
-
定义一个在foobar.clj中返回值的函数:
(ns com.acme.foobar(:使用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)
(定义fromothermodule []“b”)
- 现在尝试从foobar.clj调用它:
(defn myfunc2 [](fromothermodule))
-
来自othermodule.clj的上下文菜单我选择:
-
将REPL更改为文件/ ns
-
加载
为了使REPL意识到有新的模块,它应该能够运行 .
- 我对foobar.clj执行相同的操作,现在引用othermodule.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主项目也无济于事(这当然会让REPL业务变得非常痛苦) .
我正在使用NetBeans 6.7.1和enclojure-plugin-2009-11-3.nbm .
2 回答
从谷歌小组中的Eric Thorsen获得了正确的解决方案:
从窗口菜单创建REPL有三种方法 . 不要使用其中任何一个,而是右键单击项目并“启动项目REPL” . 现在相应地设置路径 .
我的第一个建议是从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" 之类的东西 .