Clojure - JavaVM上で動作するLisp
http://clojure.sourceforge.net/
こういうのあると思ってたけど、やっぱりあった。LispからJavaが呼べるんです。CommonLispとかとはちょっと構文とか予約語?とかが異なる一種のLisp方言ですが、基本的にはLispのようです。
Wikiの内容が充実しているようなので、詳しくはそちらを。とりあえず、src/の下にある*.cljファイルを見たり、ソースコードを見たりしてみました。定義済みシンボル一覧は下記のように grep してみると、意味が分かるものがいくつか見つかるので、それを頼りに。
$ fgrep "(defn " $CLOJURE_HOME/src/boot.clj | sort
-jar オプションで起動すると、インタラクティブモードで起動します(Replクラス)。引数にClojureコードのファイルを指定すると、起動時にロードします。
$ java -jar $CLOJURE_HOME/clojure.jar Clojure user=> (+ 1 2) 3 user=> (println "hello") hello nil user=>
インタラクティブではなく、スクリプトファイルを実行する場合は、Scriptクラスで起動します。
$ cat eighth-root.clj (defn square [x] (* x x)) (defn quadruplicate [x] (square (square x))) (defn eighth-root [x] (quadruplicate (quadruplicate x))) (println (eighth-root 2)) $ java -cp $CLOJURE_HOME/clojure.jar clojure.lang.Script eighth-root.clj 65536 $
※(2009.05.21)累乗と累乗根がごっちゃになってますね...今気づきました。
JavaのSwingを使った処理を呼び出します。上で定義した square 関数を使いまわしてみます。
$ cat swingtest.clj (import '(javax.swing JFrame) '(javax.swing JLabel)) (defn show-jframe [] (doto (new JFrame "Swing Test") (add (new JLabel (str (square 3)) 0)) ;; 0=SwingConstants.CENTER (setSize 200 100) (setVisible true))) (show-jframe) (read) ;; dummy $ java -cp $CLOJURE_HOME/clojure.jar \ clojure.lang.Script eighth-root.clj swingtest.clj