argius note

プログラミング関連

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


最後の read は処理を終了させないためのダミー。正しい方法は少しずつ調べながら見つけるつもりです。