Clojure lein应用程序和库的lein repl命名空间存在差异?
当我创建了一个Clojure lein应用程序和库的lein repl命名空间存在差异?,clojure,leiningen,Clojure,Leiningen,当我创建了一个lein新应用程序…时,我可以从我的命名空间调用lein repl中的函数。但是当我通过leinnew…创建一个库项目时,我似乎无法调用leinrepl中的函数。详情如下: 当我创建一个lein应用程序时,比如说lein new app my app,然后从项目目录(包含project.clj)执行lein repl。repl将我留在名称空间my app.core my-app.core=> 现在,我可以调用repl中的函数,甚至可以调用侧文件中定义的函数 my-app.
lein新应用程序…
时,我可以从我的命名空间调用lein repl中的函数。但是当我通过leinnew…
创建一个库项目时,我似乎无法调用leinrepl
中的函数。详情如下:
当我创建一个lein应用程序时,比如说lein new app my app
,然后从项目目录(包含project.clj
)执行lein repl
。repl将我留在名称空间my app.core
my-app.core=>
现在,我可以调用repl中的函数,甚至可以调用侧文件中定义的函数
my-app.core=> (-main)
; Hello, world!
my-app.core=> (my-app.anotherfile/foo)
; Hey, there; this is foo from anotherfile
只要我:在core.clj
的ns宏中需要[my app.anotherfile]
好,太好了,;现在我想对lein库做类似的处理。所以我lein new my lib
,然后lein repl
,我在user
命名空间中:
user=>
嗯?好的,我的lib包含了一个我想要调用的函数(这只是leiningen默认创建的函数)
我试着
user=> (in-ns 'my-lib.core)
my-lib.core=> (foo 42)
; CompilerException java.lang.RuntimeException: Unable to resolve symbol: foo in this context, compiling:(NO_SOURCE_PATH:1:1)
没有。这个怎么样
user=> (my-lib.core/foo 42)
; ClassNotFoundException two-files-lib.core java.net.URLClassLoader$1.run (URLClassLoader.java:202
啊哈!不同的错误,但仍然无法治愈lein compile
和lein javac
似乎也没有做任何事情
我无法在文档或在线中找到或推断出正确的咒语,如果您能提供建议,我将不胜感激。在默认的lein new
项目中,您需要明确要求您希望使用的名称空间--(需要'my lib.core)
只需创建给定名称的新空名称空间,如果该名称空间不存在,则不会从类路径加载任何代码
应用程序项目会自动执行此操作,并切换到REPL任务中的主命名空间,因为默认情况下,它们的项目.clj
中有一个:main foo.core
条目。对于库可以这样做,但不应该这样做——作为一个副作用,它会导致主命名空间的AOT编译,这通常是不可取的
相反,在lein2中,您可以使用:repl选项{:init ns my lib.core}
user=> (my-lib.core/foo 42)
; ClassNotFoundException two-files-lib.core java.net.URLClassLoader$1.run (URLClassLoader.java:202