lein应用程序和库的lein repl命名空间的区别?

时间:2013-04-14 15:21:01

标签: clojure leiningen

当我创建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 compilelein javac似乎也无所作为。

我无法在文档或在线中找到或推断出正确的咒语,并会感激您的建议。

1 个答案:

答案 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}