コマンドラインからClojureスクリプトを何度も実行するのは慣れていません。 REPLはより良いコマンドラインです。 ClojureはLispであり、Clojureを起動し、同じインスタンスを永続的に実行させ、再起動するのではなく相互作用するのが一般的です。実行中のインスタンスの関数を一度に1つずつ変更して実行し、必要に応じてそれらをポックすることができます。退屈で遅い伝統的な編集/コンパイル/デバッグサイクルを免れることは、Lispsの大きな特徴です。
単体テストの実行などの機能を簡単に記述できます。実行するときはいつでもREPLから呼び出すことができます。 Clojureではclojure.contrib.test-is
を使用し、テスト関数をネームスペースに追加してから、clojure.contrib.test-is/run-tests
を使用してすべて実行します。
Clojureをコマンドラインから実行しないもう一つの理由は、JVMの起動時間が非常に長くなる可能性があることです。
コマンドラインからClojureスクリプトを実際に実行したい場合は、できることがたくさんあります。詳細は、the Clojure mailing listを参照してください。
1つの方法は、コマンドライン引数の有無をテストすることです。現在のディレクトリにこのfoo.clj
考える:
(ns foo)
(defn hello [x] (println "Hello," x))
(if *command-line-args*
(hello "command line")
(hello "REPL"))
あなたはClojureのを開始するかによって異なる動作を取得します。
$ java -cp ~/path/to/clojure.jar:. clojure.main foo.clj --
Hello, command line
$ java -cp ~/path/to/clojure.jar:. clojure.main
Clojure 1.1.0-alpha-SNAPSHOT
user=> (use 'foo)
Hello, REPL
nil
user=>
あなたはこれが動作しているかを確認したい場合はClojureのソースでsrc/clj/clojure/main.clj
を参照してください。
もう1つの方法は、コードを.class
ファイルにコンパイルして、Javaコマンドラインから呼び出す方法です。ソースファイルfoo.clj
考える:
(ns foo
(:gen-class))
(defn hello [x] (println "Hello," x))
(defn -main [] (hello "command line"))
コンパイル.class
ファイルを格納するディレクトリを作成します。これはデフォルトで./classes
になります。このフォルダは自分で作成する必要がありますが、Clojureは作成しません。また$CLASSPATH
に./classes
とソースコードのディレクトリを含めるように設定してください。私はfoo.clj
が現在のディレクトリにあると仮定します。だから、コマンドラインから:classes
ディレクトリで
$ mkdir classes
$ java -cp ~/path/to/clojure.jar:./classes:. clojure.main
Clojure 1.1.0-alpha-SNAPSHOT
user=> (compile 'foo)
foo
あなたは今.class
ファイルの束を持っています。コマンドライン(デフォルトで-main
機能を実行している)から、あなたのコードを呼び出すには:
$ java -cp ~/path/to/clojure.jar:./classes foo
Hello, command line.
clojure.orgにClojureのコードをコンパイルに関する多くの情報があります。あなたは「エントリーポイント」を持っていることについて話している場合は
私は*機能*がこれには良いとは思いません。 *機能*は利用可能な機能を示していますが、一部の環境状態やコードの実行要求ではありません。 –
なぜですか? *すべての種類のものに使用される* features *:実行中のハードウェア、いくつかのコアlibs、ソフトウェアのいくつかのモード、Lisp実装のバージョン、言語のバージョン、 modeまたは:development-modeなど。 –