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さんです。よろしくお願いします。

*1:特に,core.*に含まれるライブラリはその傾向が強いようです

*2:最近では,この単一のContribライブラリはMonolithic Contribと呼ばれています

*3:Monolithic Contribと対比して,これらのライブラリはModular Contribと呼ばれています

*4:このランキング結果を求めるのに使ったプログラムはこちら→https://github.com/athos/github-survey