2

この質問と同じくらい単純ですが、同じディレクトリ内の異なる名前空間が互いに有効に参照する正しい方法を見つけることができないようです。私は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])

project.cljこのファイルには、私のviaで指定されている main メソッドも含まれています。: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 に答える