Clojure + Proce55ing(2)
前に書いたように、 Clojure は普通に既存の Java のクラスのインスタンスを作成したり、リスナーを作成したりできる。ここらへんの機能は jython 同様 reflection を使っていると思われる(当然速度面ではペナルティとなっているはず)。
いま試している Processing (http://processing.org/)は統合環境で、簡易なプログラミング言語で美しい描画ができる。もともと Java で実装されているので、完全に java としても記述できる。
Processing の簡易言語では、 java のクラス定義の本体部分だけを書くイメージで、煩雑な定型文の部分を省略できる。が、Jython から使うときは java として書く書き方に近くなり、わりと煩雑だった。
Clojure は Lisp なので、マクロがあるため、若干簡単に Processing を使えるようだ。以下は http://processing.org/learning/basics/bezier.html を Clojure で書いてみたもの。Clojure はいろいろ便利な構文があるようなのでもっと奇麗に書けるかも。
Clojure user=> (import '(processing.core PApplet)) (import '(javax.swing JFrame)) nil user=> nil user=> (defn make-bezier [] (let [f (new JFrame)] (let [p (proxy [PApplet] [] (setup [] (doto this (size 200 200) (background 0) (stroke 255) (noFill) (smooth)) (loop [i 0] (when (< i 100) (doto this (bezier (- 90 (/ i 2.0)) (+ 20 i) 210 10 220 150 (- 120 (/ i 8.0)) (+ 150 (/ i 4.0)))) (recur (+ 20 i))))))] (doto f (setSize 200 200) (add p) (setVisible true)) (. p init)))) #'user/make-bezier user=> (make-bezier) nil user=> Process inferior-lisp finished