Clojure
JavaVM上で動くLispのClojureが熱い
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(タスクに追加)するだけなので個々の計算が重いときには役立つが、個々の計算が軽い場合は役に立たない。