コマンドラインからClojureスクリプトを何度も実行するのは慣用的ではありません。REPLはより優れたコマンドラインです。ClojureはLispであるため、Clojureを起動して同じインスタンスを永久に実行したままにし、再起動するのではなく、Clojureと対話するのが一般的です。実行中のインスタンスの関数を一度に1つずつ変更し、実行して、必要に応じて突くことができます。面倒で時間がかかる従来の編集/コンパイル/デバッグサイクルを回避することは、Lispsの優れた機能です。
単体テストの実行などを行う関数を簡単に記述し、実行したいときはいつでもREPLからそれらの関数を呼び出し、それ以外の場合は無視することができます。Clojureでは、を使用しclojure.contrib.test-is
、テスト関数を名前空間に追加してから、を使用clojure.contrib.test-is/run-tests
してそれらすべてを実行するのが一般的です。
コマンドラインからClojureを実行しないもう1つの理由は、JVMの起動時間が非常に長くなる可能性があることです。
コマンドラインからClojureスクリプトを本当に実行したい場合は、さまざまな方法で実行できます。いくつかの議論については、Clojureメーリングリストを参照してください。
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=>
src/clj/clojure/main.clj
これがどのように機能するかを確認したい場合は、Clojureソースを参照してください。
もう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
したがって、コマンドラインから:
$ mkdir classes
$ java -cp ~/path/to/clojure.jar:./classes:. clojure.main
Clojure 1.1.0-alpha-SNAPSHOT
user=> (compile 'foo)
foo
ディレクトリにはclasses
、たくさんの.class
ファイルがあります。コマンドラインからコードを呼び出すには(-main
デフォルトで関数を実行します):
$ java -cp ~/path/to/clojure.jar:./classes foo
Hello, command line.
clojure.orgにはClojureコードのコンパイルに関する多くの情報があります。