当我创建lein repl
时,我在命名空间中调用lein new app ...
中的函数没有问题。但是当我通过lein repl
创建一个库项目时,我似乎无法在lein new ...
中调用函数。详情如下:
当我使用lein new app my-app
创建一个lein app时,然后从项目目录(包含project.clj
的目录)中创建lein repl
。 repl将我留在命名空间my-app.core
my-app.core=>
我现在可以在repl中调用函数,甚至是在side文件中定义的函数。
my-app.core=> (-main)
; Hello, world!
my-app.core=> (my-app.anotherfile/foo)
; Hey, there; this is foo from anotherfile
只要:require [my-app.anotherfile]
的ns宏中的core.clj
。
好的,很棒;现在我想用lein库做类似的事情。我是lein new my-lib
,然后是lein repl
,我在user
命名空间中:
user=>
是吗?好吧,我的lib包含一个我想调用的函数(这只是leiningen默认创建的函数)
(ns my-lib.core)
(defn foo
"I don't do a whole lot."
[x]
(println x "Hello, World!"))
我试试
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
AHA!不同的错误,但仍然无法治愈。 lein compile
和lein javac
似乎也无所作为。
我无法在文档或在线中找到或推断出正确的咒语,并会感激您的建议。
答案 0 :(得分:3)
在默认的lein new
项目中,您需要require
要明确使用的命名空间 - (require 'my-lib.core)
。 in-ns
只是创建一个给定名称的新空命名空间(如果它尚不存在),它不会从类路径加载任何代码。
App项目会自动执行此操作并切换到REPL任务中的主命名空间,因为默认情况下它们在:main foo.core
中有project.clj
个条目。它可以用于库,但你不应该 - 作为副作用,它会导致主命名空间的AOT编译,这通常是不可取的。
相反,在lein2中,您可以使用:repl-options {:init-ns my-lib.core}
。