2016-04-16 15 views
2

~/src/proj/{foo,bar}.cljという小さなプロジェクトがあり、emacs、cider、nREPLでハッキングしています。 bar.cljでは(def base-13-joke 42)を、foo.cljのコードはbar.cljbase-13-jokeを参照してください。これはどうすればいいですか?clojure/cider/nrepl内の兄弟ファイルから項目をインポートするにはどうすればよいですか?


私の現在のクラスパス

/home/jonas/src/mine/code/move-the-box/target/classes 
/home/jonas/.m2/repository/cider/cider-nrepl/0.11.0/cider-nrepl-0.11.0.jar 
/home/jonas/.m2/repository/org/tcrawley/dynapath/0.2.3/dynapath-0.2.3.jar 
/home/jonas/.m2/repository/org/clojure/tools.nrepl/0.2.12/tools.nrepl-0.2.12.jar 
/home/jonas/.m2/repository/clojure-complete/clojure-complete/0.2.4/clojure-complete-0.2.4.jar 
/home/jonas/.m2/repository/org/clojure/clojure/1.8.0/clojure-1.8.0.jar 
/usr/lib/jvm/java-7-openjdk-amd64/lib/tools.jar 

~/src/proj = /jonas/src/mine/code/move-the-boxで)私は効果がないように見えた(add-classpath "file:///jonas/src/mine/code/move-the-box")だけでなく、IllegalArgumentException array element type mismatch java.lang.reflect.Array.set (Array.java:-2)をスロー(cider.nrepl.middleware.util.java/add-classpath! "file:///home/jonas/src/mine/code/move-the-box")を試してみました。そこには何が起こっているのですか?

答えて

3

複数のClojureソースファイルを1つのプロジェクトとして扱う場合は、LeiningenまたはBootのようなビルドツールを使用すると、多くのマイレージが得られます。たとえば、複数のソースファイルを持つmyprojectという簡単なBootプロジェクトを作成する方法を次に示します。

まず、これらの内容で(それはどこもかまいません)myprojectディレクトリを作成します。

myproject 
├── build.boot 
└── src 
    └── myproject 
     ├── bar.clj 
     └── foo.clj 

それが何か他のもの(例えば、あなたのコードの一部を実行している作成を行う前に、ブートは、あなたのbuild.bootファイルを実行しますJAR、またはREPLを開始する)。 bar.clj

(set-env! :source-paths #{"src"}) 

を、あなたは他からアクセスしたい定義を置く:今のところ、あなたがブートを伝えるために必要なすべてのソースファイルはこれだけbuild.bootに次の行を追加し、srcディレクトリになるということですコード:

(ns myproject.bar) 

(def base-13-joke 42) 

その後、foo.cljに、あなたはns宣言で:require句を使用してbar.cljを参照することができます。

(ns myproject.foo 
    (:require [myproject.bar :as bar])) 

(defn make-joke [] 
    (println (Long/toString bar/base-13-joke 13))) 

それだけです。もちろん、おそらく実際ににはのコードを書きます。起動処理の「処理」はタスクになります。プロジェクト内の関数の1つを単に実行するものを作成しましょう。

Bootで実行するタスクを定義する場合は、そのタスクを定義するコードをbuild.bootファイルに追加します。まず、メインコード(この場合はmyproject.foo名前空間内のmake-joke関数)の一部を呼び出すので、そのコードはrequireになります。 build.bootに次の行を追加します

(require '[myproject.foo :as foo]) 

今、私たちは(build.bootで、再び)シンプルrunタスクを定義することができ、当社の機能を実行すること:

(deftask run [] 
    (with-pass-thru _ 
    (foo/make-joke))) 

with-pass-thruビジネスはちょうどの一部に関係していますBootのタスクの詳細は、hereで詳しく読むことができます。

タスクの実行は非常に簡単です。これをプロジェクトルートのコマンドラインで実行します。

$ boot run 
33 

ブートにはいくつかのタスクが組み込まれています。あなたがboot replを実行した場合たとえば、あなたはboot.user名前空間でお馴染みのREPLプロンプトが現れます:

boot.user=> 

は、この名前空間はブートbuild.bootスクリプトを実行しているものと同じであるので、我々はrequireを持っているので、 build.bootmyproject.fooのために、我々はREPLで、その名前空間を使用することができます。もちろん

boot.user=> (foo/make-joke) 
33 
nil 

、することができますあまりにもrequire他の名前空間:

コードを再読み込みしてCIDERとやりとりするなど、Bootでできることはたくさんあります.CIDERについては、Boot Wikiを参照してください。

関連する問題