我遇到了Enclojure REPL的问题,并使用了clojure模块。文件/ ns的加载/更改REPL与隔离的clojure文件一起工作正常,但是打破了一个文件,该文件引用了我尝试从我的项目中使用的另一个clojure文件。
以下是具体步骤:
定义一个在foobar.clj中返回值的函数:
(ns com.acme.foobar (:使用com.acme.othermodule))
(defn myfunc1 [] “A”)
打开Netbeans IDE REPL
从foobar.clj的上下文菜单中选择:
从REPL调用(myfunc1)函数。这很好用:
com.acme.foobar => (myfunc1) “一个”
当我尝试从foobar引用其他文件时,问题就开始了。这是我的所作所为:
创建一个新的clojure模块othermodule.clj
(ns com.acme.othermodule)
(defn fromothermodule [] “B”)
现在尝试从foobar.clj中调用它:
(defn myfunc2 [] (fromothermodule))
从othermodule.clj的上下文菜单中选择:
为了使REPL意识到有新模块,它应该能够运行。
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。
答案 0 :(得分:2)
在Google群组中获得Eric Thorsen的正确解决方案:
从窗口菜单创建REPL有三种方法。不要使用任何这些,而是正确 单击项目并“启动项目REPL”。现在路径已相应设置。
答案 1 :(得分: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”。