Clojure Contrib ライブラリとは
今年も残すところ1ヶ月となり,恒例のアドベントカレンダーの季節がやってきました。このエントリは,Clojure Contrib Library Advent Calendar 2013 の第1日目の記事です。今回は,Contribライブラリの概要について説明します。
contribライブラリとは
そもそもContribライブラリとは何かというと,多くの場面で共通して使える便利な機能を提供する,Clojureの「準標準」的な位置づけのライブラリです。
Contribライブラリは,多くの点で標準ライブラリと共通する部分をもちます。たとえば,Clojure自身と同様,Contribライブラリは github.com/clojure 上でホスティングされています。また,Clojureと同じライセンスおよびCA(Contributor Agreement)で開発されていて,後々標準ライブラリへ移行することができるような仕組みになっています。
Contribライブラリと標準ライブラリの本質的な違いは開発体制にあります。Clojureコアや標準ライブラリは,スクリーニングやRich Hickeyのレビューなど比較的厳格な開発プロセスの下で開発されていますが,Contribライブラリにはそういった制限がありません。そのため,それぞれのライブラリで,わりと自由に開発が進められています。そういった事情を受けてか,Contribライブラリにはかなり野心的なものが多く*1,さながらライブラリとして提供する機能の実験場のような様相を呈しています。
どんなライブラリがあるか?
Contribライブラリは,もともとclojure-contribというひとつの大きなライブラリとして提供されていて,それぞれの名前空間でまったく別個の機能を扱っていました*2。しかし,この巨大なライブラリの扱いの悪さが問題となり,Clojure 1.3がリリースされる頃に各機能ごとに個別のライブラリとして提供される現在の形になりました*3。
2013年12月現在では,40個弱のライブラリがContribライブラリとして提供されています。それぞれのライブラリの概要を以下に示します。
ライブラリ名 | 概要 |
algo.generic | assocやconjなどの関数のマルチメソッド版 |
algo.monads | モナドライブラリ |
build.poms | contribライブラリ用のサンプルのPOMファイル |
core.async | チャネルベースの非同期プログラミング |
core.cache | 種々の戦略によるキャッシュの実装(主にcore.memoizeで使用) |
core.contracts | 契約プログラミングのための関数およびマクロ |
core.incubator | Clojureコアへの追加が検討されている関数・マクロ群 |
core.logic | Prologライクな論理プログラミング言語の実装 |
core.match | パターンマッチングライブラリ |
core.memoize | メモ化ライブラリ |
core.rrb-vector | RRB木による効率的でイミュータブルなベクタの実装 |
core.typed | Clojureに静的型をつける拡張 |
core.unify | 単一化アルゴリズムの実装 |
data.codec | 種々のコーデックのエンコード・デコード(現在はbase64のみ) |
data.csv | CSV形式の読み書き |
data.finger-tree | 2-3フィンガーツリーによる永続的なコレクション |
data.generators | ランダムなClojureデータ生成器(主にtest.generativeで使用) |
data.json | JSON形式の読み書き |
data.priority-map | 優先度つきマップの実装 |
data.xml | XML形式の読み書き |
data.zip | Zipper向けのフィルターの実装 |
java.classpath | JVMのクラスパスを扱うためのユーティリティ |
java.data | JavaBeansとClojureデータとの相互変換 |
java.jdbc | JDBCを介したSQLデータベースのインタフェース |
java.jmx | Clojure向けのJMXサポート |
math.combinatorics | 順列・組み合わせなどの効率的なアルゴリズムの実装 |
math.numeric-tower | Clojureの種々の数値型に対応した数学関数 |
test.benchmark | ベンチマークスイート |
test.generative | QuickCheckライクな生成的テスト |
tools.cli | コマンドライン引数のパーサ |
tools.logging | ロギングライブラリ |
tools.macro | ローカルマクロとシンボルマクロの実装 |
tools.namespace | 名前空間管理のためのツール |
tools.nrepl | nREPL通信用ライブラリ |
tools.reader | ClojureによるClojureリーダの実装 |
tools.trace | トレースをとるためのマクロ |
実にさまざまなライブラリがあります。なかには,開発がひと通りが完了し、枯れたライブラリになったもの(algo.genericやdata.csv)もあれば,Rich Hickeyが開発し,今年5月にContribライブラリ入りして一気に人気になったcore.asyncのような例もあります。最近では,クラウドファンディングにより,core.typedの開発に3万5千ドルの資金が集まったという話題もありました。そして,今もなお新しいライブラリがContribライブラリに追加され,活発に開発され続けています。
どんなライブラリが人気か?
どんなライブラリがあるかを紹介したついでに,どんなライブラリに人気があるかもお見せしましょう。以下の表は,GitHubのClojureで書かれた全プログラムに対して,Leiningenのproject.cljから依存ライブラリを解析して求めた2013年11月現在のContribライブラリのランキングです*4。順位は全ライブラリ中で何位であるかを表し,度数はどれだけのライブラリがそのライブラリに依存しているかを表しています。
順位 | ライブラリ名 | 度数 |
7 | data.json | 603 |
10 | tools.logging | 535 |
15 | tools.cli | 402 |
16 | java.jdbc | 388 |
18 | math.numeric-tower | 266 |
27 | core.logic | 165 |
28 | math.combinatorics | 164 |
33 | core.async | 140 |
34 | tools.nrepl | 139 |
44 | tools.trace | 118 |
47 | core.match | 114 |
48 | data.xml | 107 |
50 | data.csv | 103 |
55 | data.zip | 93 |
56 | tools.namespace | 84 |
69 | tools.macro | 69 |
79 | algo.monads | 61 |
79 | data.codec | 61 |
83 | core.memoize | 56 |
98 | tools.reader | 41 |
103 | algo.generic | 40 |
114 | core.typed | 36 |
142 | core.cache | 31 |
142 | data.priority-map | 31 |
166 | test.generative | 27 |
183 | java.classpath | 23 |
210 | java.jmx | 18 |
219 | data.generators | 16 |
269 | core.unify | 12 |
269 | data.finger-tree | 12 |
395 | core.contracts | 7 |
435 | java.data | 6 |
1625 | core.rrb-vector | 1 |
見ていただくと分かるように,ライブラリによって使用頻度はまちまちです。ライブラリがよく使われる理由,あまり使われない理由にもさまざまなものがあると思いますが,このアドベントカレンダーでは上位のライブラリを高い優先度で扱いながらも,万遍なくさまざまなライブラリについて紹介していくつもりです。
おわりに
今回はContribライブラリがどんなものかというざっくりとした説明をしました。
いよいよ明日からは具体的にそれぞれのライブラリをひとつずつ見ていきます。今まで知らなかったライブラリや,知っているライブラリの中でも知らなかった機能について,ひとつでも多く「こんなものもあるのか」という発見があることを期待します。
次回は@ponkoreさんです。よろしくお願いします。