Clojure + Proce55ing(2)

Bezier in Clojure


前に書いたように、 Clojure は普通に既存の Java のクラスのインスタンスを作成したり、リスナーを作成したりできる。ここらへんの機能は jython 同様 reflection を使っていると思われる(当然速度面ではペナルティとなっているはず)。

いま試している Processing (http://processing.org/)は統合環境で、簡易なプログラミング言語で美しい描画ができる。もともと Java で実装されているので、完全に java としても記述できる。
Processing の簡易言語では、 java のクラス定義の本体部分だけを書くイメージで、煩雑な定型文の部分を省略できる。が、Jython から使うときは java として書く書き方に近くなり、わりと煩雑だった。

ClojureLisp なので、マクロがあるため、若干簡単に Processing を使えるようだ。以下は http://processing.org/learning/basics/bezier.htmlClojure で書いてみたもの。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