1

当我lein repl创建一个lein new app .... lein repl但是当我只是通过创建库项目时,我似乎无法调用函数lein new ...。详情如下:

当我创建一个 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

只要我: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

啊哈!不同的错误,但仍然无法治愈。lein compile并且lein javac似乎也没有做任何事情。

我无法在文档或在线上找到或推断出正确的咒语,我将不胜感激。

4

1 回答 1

3

在默认lein new项目中,您需要require明确使用的命名空间 - (require 'my-lib.core)in-ns如果它尚不存在,只需创建一个给定名称的新空命名空间,它不会从类路径加载任何代码。

应用程序项目会自动执行此操作并切换到 REPL 任务中的主命名空间,因为它们默认有一个:main foo.core条目。project.clj可以为库执行此操作,但您不应该这样做 - 作为副作用,它会导致主命名空间的 AOT 编译,这通常是不可取的。

相反,在 lein2 中,您可以使用:repl-options {:init-ns my-lib.core}.

于 2013-04-14T16:27:47.177 回答