2

就像这个问题一样简单,我似乎无法为同一目录中的不同名称空间找到正确的方法来有效地相互引用。我有两个文件:

project_root/src/babbler/core.clj

(ns babbler.core
  (:gen-class)
  (use '[clojure.string :only (join split)]))

(defn foo [] "Foo")

然后project_root/src/babbler/bar.clj

(ns babbler.bar)

(use [babbler.core :as babble])

该文件还包含一个 main 方法,在我的project.cljvia中指定:main babbler.bar

我的整个结构是逆时针生成的,带有默认的 leiningen 模板。

运行结果lein repl是这样的:

Exception in thread "main" java.lang.ClassNotFoundException: babbler.core, compiling:(babbler/bar.clj:3:1)
    at clojure.lang.Compiler.analyze(Compiler.java:6380)
    at clojure.lang.Compiler.analyze(Compiler.java:6322)
    at clojure.lang.Compiler$VectorExpr.parse(Compiler.java:3024)
    at clojure.lang.Compiler.analyze(Compiler.java:6363)
    at clojure.lang.Compiler.analyze(Compiler.java:6322)

(...)

4

1 回答 1

3

use应该在命名空间的定义内:

(ns babbler.bar
  (use [babbler.core :as babble]))

事实上use是气馁,你可能想把它写成:

(ns babbler.bar
  (:require [babbler.core :as babble :refer [foo]]))

这样你就可以将 babbler.core 命名空间中的任何函数 f 调用为 babble/f,并且你可以直接调用 foo。此外,您的文件包含有关 foo 来自何处的信息,因此您或其他人不需要去搜索它。

于 2014-09-22T15:33:49.097 回答