Clojure

JavaVM上で動くLispClojureが熱い
Clojure

Java資産の活用

(def a (into-array [2 3 1])) ;;;into-arrayはClojureの列をJavaの配列に変える

(seq a) ;=> (2 3 1) ;;;seqは整列可能なObjectをClojureの列に変える

(java.util.Arrays/sort a
                       (proxy [java.util.Comparator] [] ;;;無名interface/classを作れる。
		           (compare [a b]
                              (- a b))))

(seq a) ;=> (1 2 3) 

(java.util.Arrays/sort a (comparator >)) ;;;LispなのでComparator作るの面倒だと思ったら便利な関数/マクロを作れる。

(seq a) ;=> (3 2 1)

注:JavaのObjectを簡単に触れられると説明するのが目的です。普通はArrays/sortは使わずにClojureのsortかsort-byを使います。

Lisp的で強力な並行

(defn slow [n] ;;;遅い関数
  (do (Thread/sleep 1000) ;;;1秒待ってからnをそのまま返す。
      n))

(map slow (range 1 10)) ;;;10秒かかって => (1 2 3 4 5 6 7 8 9 10)

(pmap slow (range 1 10)) ;;;並行map。1秒強で => (1 2 3 4 5 6 7 8 9 10)

pmapは内部でjava.util.concurrent/Executorを使っている。pmapは全ての要素に対する計算を頭から順番にExecutorにsubmit(タスクに追加)するだけなので個々の計算が重いときには役立つが、個々の計算が軽い場合は役に立たない。