15

私はまだClojureにかなり慣れていないので、これが完全に初心者の質問である場合は申し訳ありませんが、オンラインで十分な回答を見つけることができませんでした.

基本的に、私の問題は、プロジェクトを実行しようとすると、次のようなエラーが発生することです。

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

この場合、greeter.clj はプロジェクト内のメイン関数を含むファイルと同じディレクトリにあります。

説明のために、次のようなディレクトリ ツリーを持つプロジェクトを作成しました。

ここに画像の説明を入力

core.clj の私のコードは次のとおりです。

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

(defn -main[] (greet))

greeter.clj の私のコードは次のとおりです。

(ns greeter)

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

入力するたびにlein run -m omg.core、上記の例外が発生します。私は何を間違っていますか?

4

1 に答える 1

18

グリーターの名前空間が間違ったレベルにある

(ns omg.greeter)

名前空間の名前はパス内のフォルダーに対応しているため、/src/omg/greeter.clj 内のファイルを使用するには、そのファイルにomg.greeter名前空間が含まれている必要があります。呼び出したばかりにしたい場合は、greeter1つ下のフォルダーに移動します

を使用するときrequireは、呼び出す関数の名前空間を綴る必要があります。この場合は(omg.greeter/greet). これは面倒なので、use関数には名前空間が必要であり、すべての関数を現在の名前空間に追加します。より選択的な別のオプションは、ネームスペース定義で :refer オプションとともに require を使用することです

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

また

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

ほとんどの人は、名前空間の要件をns呼び出しのファイルの先頭に入れます。

http://clojure.org/namespacesを簡単に読むと役立つと思います

于 2012-05-02T00:15:08.110 に答える