如何使用leiningen引用其他文件中的函数?

时间:2012-05-02 00:06:17

标签: clojure classpath leiningen

我仍然是Clojure的新手,所以如果这是一个全新的问题,我很抱歉,但我无法在网上找到足够的答案。

基本上,我的问题是,每当我尝试运行我的项目时,都会收到如下错误:

Exception in thread "main" java.lang.RuntimeException: java.io.FileNotFoundException: Could not locate greeter__init.class or greeter.clj on classpath: 

在这种情况下,greeter.clj在项目中与包含我的main函数的文件位于同一目录中。

为了便于说明,我创建了一个具有如下目录树的项目:

enter image description here

我的core.clj代码如下:

(ns omg.core
(require [greeter]))

(defn -main[] (greet))

我的greeter.clj代码是:

(ns greeter)

(defn greet [] println("Hello world"))

每当我输入lein run -m omg.core时,我都会得到上述异常。我做错了什么?

1 个答案:

答案 0 :(得分:16)

欢迎命名空间它处于错误的级别

(ns omg.greeter)

命名空间中的名称对应于路径中的文件夹,以便使用该文件 /src/omg/greeter.clj该文件应包含omg.greeter命名空间。如果你想让它刚刚调用greeter,那么将其移到一个文件夹

使用require时,您需要拼出您正在调用的函数的命名空间,在本例中为(omg.greeter/greet)。由于这很痛苦,use函数需要一个命名空间,并将其所有函数添加到当前命名空间。另一个更具选择性的选项是在命名空间定义中使用require和:refer选项

(ns omg.core
    (require [omg.greeter :refer :all]))

(ns omg.core
    (require [omg.greeter :refer [greet]]))

大多数人将命名空间要求放在文件顶部的ns调用中。

快速阅读http://clojure.org/namespaces将有助于