Commits

camlspotter committed 92ccb72

update

Comments (0)

Files changed (1)

ocaml-ext-tools.rst

 
 2012年12月での関数型言語 OCaml コンパイラ一式には入っていない
 内部もしくは外部開発されたのツール群の紹介を行う。
-多岐に渡るので、一つ一つの詳しい説明は行わない。
+例によって多岐に渡るので、一つ一つの詳しい説明は行わない。
 各ツールの細かい情報はそれぞれのドキュメントを参照して欲しい。
+リンクは貼るの面倒だからググれ
 
 もし知らないツール名があったらちょっと読んでみて欲しい。
 もしかしたらあなたの問題を解決するツールがあるかもしれないから。
 ライブラリとツールの中間のようなコード生成系も取り上げた。
 基本的に触ったことのある物しか紹介しない。
-リンクは貼るの面倒だからググれ
+なんでこれはなんで取り上げてないの?と思ったら、それは使ったことないからです。ごめんね。
 
 ★は重要度。五点満点。
 
 コンパイラ同梱のツールの紹介はもうした。
 http://d.hatena.ne.jp/camlspotter/20121204/1354588576
 
+@tmaeda さんも既に似たようなのを更に詳しく書いてたなあ…
+http://tmaeda.s45.xrea.com/td/20121028.html
+
+ビルド関連
+================================
+
+OMake ★★★★
+--------------------------------
+
+ビルドツール。
+
+Make や OCamlBuild と同様のビルドツール。
+
+* Makefile のような文法によるビルドルール表記が可能で参入障壁が低い
+* Makefile よりも随分マシなセマンティックスな言語。関数による際利用可能なビルドルール記述
+* ファイル更新時ではなくファイルのチェックサムによるリビルド。更新されたが変化はなかった自動生成ファイルの不要なコンパイルが行われない
+* サブディレクトリでのビルドが楽
+* ``-P`` スイッチによるファイル変更時の自動リビルド
+* OCaml プログラムビルドのための便利な機能がもともと入っているので、OCaml のための複雑な関数記述が不要
+* LaTeX や C のルールももうある
+* ちゃんとスケールする (Jane Street の 100万行程度の多岐のディレクトリにわたる OCaml プロジェクトでも動く)
+* マニュアルに日本語の訳がある (英語: http://omake.metaprl.org/manual/omake.html 日本語: http://omake-japanese.sourceforge.jp/ )
+
+私は OCaml のプログラムは今のところ OMake を使っている。問題がないわけではない:
+
+* スコープルールが特殊。ビルドのために便利なようになっているらしいが、わかったようなわからないような、である
+* 依存関係を完全に抑える努力をしないと無駄なリビルドが発生する
+* お仕着せの OCaml ビルドルールで満足できなくなると関数を沢山書き始めて辛い
+* ld as needed と相性が悪く ``-P`` のビルドが上手くいかない人が ( http://d.hatena.ne.jp/camlspotter/20121002/1349162772 )
+
+とはいえ小さい OCaml プロジェクトの OMakefile はあっけないほど簡単に書けるので使ってみると良い。(まあこれは OCamlBuild にも言えることだが)
+
+OCamlMakefile ★★
+------------------------------
+
+OCaml のための Makefile マクロ集
+
+OMake や OCamlBuild みたいな新しい物を覚えるのは年を取ってしまってどうも…という人は
+OCamlMakefile という OCaml プログラムをビルドする際に便利なマクロが詰まった OCamlMakefile
+を使うと良い、が、 OCamlMakefile のマクロを覚えるコストと OMake や OCamlBuild の初歩を
+学ぶコストはどちらが小さいか。
+
+私は5日程使った記憶がある
+
 OCamlFind / Findlib ★★★★★
-================================
+---------------------------------
 
 ライブラリパッケージマネージャおよびビルド補助ツール
 
 
 ちなみに OCamlFind は Findlib というライブラリの上に作られたツールなので自分自身の OCamlFind パッケージ名は findlib。なのに OPAM パッケージ名は ocamlfind というちょっと変な名付けになってる。
 
-OMake ★★★★
-================================
+OCamlFind はある種のパッケージシステムでもあるわけだけど
+パッケージ配布には焦点を置いていないのでビルドシステムに分類した。
 
-ビルドツール。
-
-Make や OCamlBuild と同様のビルドツール。
-
-* Makefile のような文法によるビルドルール表記が可能で参入障壁が低い
-* Makefile よりも随分マシなセマンティックスな言語。関数による際利用可能なビルドルール記述
-* ファイル更新時ではなくファイルのチェックサムによるリビルド。更新されたが変化はなかった自動生成ファイルの不要なコンパイルが行われない
-* サブディレクトリでのビルドが楽
-* ``-P`` スイッチによるファイル変更時の自動リビルド
-* OCaml プログラムビルドのための便利な機能がもともと入っているので、OCaml のための複雑な関数記述が不要
-* LaTeX や C のルールももうある
-* ちゃんとスケールする (Jane Street の 100万行程度の多岐のディレクトリにわたる OCaml プロジェクトでも動く)
-* マニュアルに日本語の訳がある (英語: http://omake.metaprl.org/manual/omake.html 日本語: http://omake-japanese.sourceforge.jp/ )
-
-私は OCaml のプログラムは今のところ OMake を使っている。問題がないわけではない:
-
-* スコープルールが特殊。ビルドのために便利なようになっているらしいが、わかったようなわからないような、である
-* 依存関係を完全に抑える努力をしないと無駄なリビルドが発生する
-* お仕着せの OCaml ビルドルールで満足できなくなると関数を沢山書き始めて辛い
-* ld as needed と相性が悪く ``-P`` のビルドが上手くいかない人が ( http://d.hatena.ne.jp/camlspotter/20121002/1349162772 )
-
-とはいえ小さい OCaml プロジェクトの OMakefile はあっけないほど簡単に書けるので使ってみると良い。(まあこれは OCamlBuild にも言えることだが)
-
-OCamlMakefile ★★
+パッケージシステム
 ========================
 
-OCaml のための Makefile マクロ集
-
-OMake や OCamlBuild みたいな新しい物を覚えるのは年を取ってしまってどうも…という人は
-OCamlMakefile という OCaml プログラムをビルドする際に便利なマクロが詰まった OCamlMakefile
-を使うと良い、が、 OCamlMakefile のマクロを覚えるコストと OMake や OCamlBuild の初歩を
-学ぶコストはどちらが小さいか。
-
-私は5日程使った記憶がある
-
-CamlIDL ★★
-================
-
-OCaml と C の間を取り持つ FFI(Foreign Function Interface) の自動生成ツール
-
-OCaml は C や他言語との橋渡しに C を使う。C関数を OCaml の関数として使うことができるのだが、
-そのままでは普通は使用できない。C関数を OCamlの GC やメモリモデルに沿った形で呼び出す
-ラッパ関数から間接的に呼び出す必要がある。このラッパ関数はスタブとよく呼ばれる。
-そのスタブの型安全性は全く保証されていない。正しい記述方法は
-http://caml.inria.fr/pub/docs/manual-ocaml-4.00/manual033.html
-に記載されているとおりだが、ちょっと間違うとすぐにプログラムがクラッシュする。
-それも GC に関連する問題だと大変だ、間違った関数を呼んでもそこではクラッシュしない…
-しばらくたって GC が走るとクラッシュする。スタブのデバッグは大変だ。
-
-CamlIDL は MIDL という C のヘッダにアノテーションを記述することで
-C関数を OCaml から呼び出すためのスタブを自動生成するツール。
-一応 OCaml のモジュールを COM コンポネントにする機能も付いているが、まあこっちは知らない。
-
-アノテーションが正確である限り CamlIDL は正しいスタブを作ってくれる。
-むろん、アノテーションを間違うとどうしようもないが、それでも手でスタブを書くよりは
-手間は省けるし安全かもしれない。簡単な型の C関数ならかなり楽にスタブを作ってくれる。
-
-が、そのアノテーションが抑えられないような物を書こうとすると工夫が必要になる。
-例えば polymorphic variant を使ったサブタイプを入れたいなど…
-そういう場合は IDL ファイルに前処理をしたり
-生成された OCaml コードに後処理をしたり、まあいろいろとやれないこともない。
-が、まず CamlIDL のチュートリアルから。
-
-まあスタブが10個くらいですむなら私は手で書く。ちゃんと OCaml ランタイムのことがわかっていれば
-手書きでもそう間違いはおこらないはずだ。
-
-OCamlSpotter ★★★★
-================================
-
-名前の定義を探しだすコード解析ツール
-
-人が書いた OCaml コードで、この変数の定義はどこか?とか、この型の定義はどこに?
-とか検索するのは結構骨が折れる。 grep や tags では polymorphism や let shadowning がある
-OCaml ではいくつも候補が出てきてしまい、そういう際にはどれが正しい定義かよくわからなくなってくる。
-
-しかし人間にはわからなくてもコンパイラは全てを知っている。OCamlSpotter はコンパイラがソースを
-コンパイルした際の結果である cmt ファイルを解析し、ソースコードに現れる名前が、どこで定義されたものかを
-解析表示することで、コードを読む際の手間を大幅に短縮するツール。Emacs や Vim からも呼び出すことが
-でき、簡単なキーでカーソルにある名前の定義へとジャンプすることができる。
-
-OCamlSpotter を利用するにはソースコードを -bin-annot というオプションでコンパイルし、 cmt ファイル
-を生成する必要がある。そしてもちろんこの cmt ファイルとソースファイルは消さずに残して置かなければならない。
-ライブラリがインストールされる場合には cmt ファイルも共にインストールする必要がある。
-
-これは私が書いたツールなのだが、私の生計は OCaml プログラミングではなくなった今、あまり以前のように
-ガンガンとメンテする暇がないのが残念。とりあえず最新の OCaml コンパイラでとりあえず動くものは公開しているが
-バグもある(なかなか直らない)。バグは bitbucket の issues 
-( http://bitbucket.org/camlspotter/ocamlspot )に報告してくれれば直す気も出るし、
-パッチはもっと歓迎。
-
-TypeRex ★★★★
-================================
-
-Emacs 用の OCaml IDE。
-
-OCamlSpotter と同じような機能にさらに独自ハイライトや
-インデント、リファクタリング(変数名を変更すると同じ変数(同じ名前の変数ではなく、同じ定義を指す変数だけ!を変更してくれる)
-も搭載されている。
-
-実はリファクタリングは OCamlSpotter にもあるし、インデントは OCaml-indent のほうが先だし、
-ちょっとパクられてるなーという被害妄想が私にはある。こういう時 OCaml専業+フレンチコネクションは強い。
-
-問題はプロセスをガンガン作るので Cygwin と相性が悪いってことか。
-Mac OS X ともなにか問題があるようで、 TypeRex が動かなかったら OCamlSpotter も試してみてくれい。
-
 Oasis ★★★
-========================
+-------------------------
 
 統一的ビルドインターフェースを提供
 
 アップロードがあまりに不親切かつ面倒だったからだ。今はもう OPAM repo だね。
 
 OPAM ★★★★★
-========================
+-------------------------
 
 パッケージマネージャとパッケージレポ
 
 普通にある…万能なソースベースのパッケージシステムなんかないのだ)
 
 GODI ★?
-================
+--------------------
 
 これまたパッケージシステム。 
 
 パッケージにあるソフトを改造しにくかったような…今は改善されているのではないか…とも思うが、
 Oasis や OPAM との比較は私にはできません。誰か教えてください。
 
+コード自動生成
+==============
+
+CamlIDL ★★
+------------------
+
+OCaml と C の間を取り持つ FFI(Foreign Function Interface) の自動生成ツール
+
+OCaml は C や他言語との橋渡しに C を使う。C関数を OCaml の関数として使うことができるのだが、
+そのままでは普通は使用できない。C関数を OCamlの GC やメモリモデルに沿った形で呼び出す
+ラッパ関数から間接的に呼び出す必要がある。このラッパ関数はスタブとよく呼ばれる。
+そのスタブの型安全性は全く保証されていない。正しい記述方法は
+http://caml.inria.fr/pub/docs/manual-ocaml-4.00/manual033.html
+に記載されているとおりだが、ちょっと間違うとすぐにプログラムがクラッシュする。
+それも GC に関連する問題だと大変だ、間違った関数を呼んでもそこではクラッシュしない…
+しばらくたって GC が走るとクラッシュする。スタブのデバッグは大変だ。
+
+CamlIDL は MIDL という C のヘッダにアノテーションを記述することで
+C関数を OCaml から呼び出すためのスタブを自動生成するツール。
+一応 OCaml のモジュールを COM コンポネントにする機能も付いているが、まあこっちは知らない。
+
+アノテーションが正確である限り CamlIDL は正しいスタブを作ってくれる。
+むろん、アノテーションを間違うとどうしようもないが、それでも手でスタブを書くよりは
+手間は省けるし安全かもしれない。簡単な型の C関数ならかなり楽にスタブを作ってくれる。
+
+が、そのアノテーションが抑えられないような物を書こうとすると工夫が必要になる。
+例えば polymorphic variant を使ったサブタイプを入れたいなど…
+そういう場合は IDL ファイルに前処理をしたり
+生成された OCaml コードに後処理をしたり、まあいろいろとやれないこともない。
+が、まず CamlIDL のチュートリアルから。
+
+まあスタブが10個くらいですむなら私は手で書く。ちゃんと OCaml ランタイムのことがわかっていれば
+手書きでもそう間違いはおこらないはずだ。
+
+Type_conv, Sexplib, Bin_prot ★★★
+-------------------------------------
+
+型定義から便利なコードを自動生成するフレームワーク、とその応用
+
+代数的データ型を使っているとその代数構造を利用したプログラムコードを
+沢山手で書く、大変便利なわけだが、その代数構造から決まりきったコードを記述することが
+ままある。例えばプリンタとか::
+
+    type t = Foo | Bar of int
+
+    let show_t = function
+      | Foo -> "Foo"
+      | Bar n -> "Bar of " ^ string_of_int n
+
+    type t' = Poo | Pee of float
+
+    let show_t' = function
+      | Poo -> "Poo"
+      | Pee n -> "Pee of " ^ string_of_float n
+
+上の例でもわかるようにコンストラクタ名や型引数の違いはあるが、``show_t`` も
+``show_t'`` も基本的にやってることは同じ。完全にルーチンワークだ。
+こういったルーチンワーク(Boiler plate code)は書きたくない、できればコンパイラに
+自動生成させたいというのが人の常で、type_conv はこういった型定義からの自動コード生成
+を支援するための CamlP4 フレームワーク。type_conv では type 宣言が拡張されていて
+``with <名前>`` というのをくっつけることができる::
+
+    type t = Foo | Bar of int with show
+
+    type t' = Poo | Pee of float with show
+
+こう書くと type_conv は ``show`` という名前で登録されたコード生成モジュールを
+呼び出して型定義情報を与える、生成モジュールはやはり P4 で書かれていて例えば
+上の ``show_t`` や ``show_t'`` を生成する、という具合だ。もちろん生成モジュール
+は誰かが書かねばならない。 まあ、 Haskell の deriving をよりプログラマブルに
+倒したものと考えれば当たっているだろう。
+
+type_conv でよく使われるコード生成モジュールが sexp と bin_prot。両方共
+OCaml の値の一種のプリンタとパーサを提供しているが sexp が S-式の形で、
+bin_prot が通信に特化した binary の形で出入力を提供する。
+Sexp は 設定ファイルに OCaml の値を直接書き込んだり、読み込んだり、
+人がエディタで変更したりできるので、結構便利。
+また、型 t を sexp_of_t で S-式に変換した後、``Sexp.pp_hum`` で
+プリティプリントすることで簡単なデバッグプリントでの OCaml の値のプリントができる。 
+(もちろん S-式の形でプリントされるので読みにくいかもしれないが、
+慣れれば結構読めるものである)
+
+type_conv 以下は Jane Street 謹製なので安心です。
+
+問題は自分で生成モジュールを作るのは P4 プログラミングを伴うので結構大変ってこと。
+自作が面倒なら sexp で手を打つのが楽。 Sexplib はかなりちゃんとドキュメントが書かれている。
+
+OCaml-Deriving ★★★
+--------------------------
+
+OCaml-deriving は type_conv と同じ目的のやはり CamlP4 でのフレームワーク。
+こちらは ``with hoge`` の代わりに ``deriving hoge`` と書く。js_of_ocaml
+で使われている。 Type_conv と OCaml_deriving が共存できるかどうかは、知らない。
+
+OCaml-deriving は show があるのが嬉しいかな。まあ type_conv でも meta_conv
+使って ``with conv(ocaml)`` すれば同じ事出来ますけどね。
+
+Atdgen ★
+-------------------
+
+Atdgen はこれまた型定義からのコード自動生成ツール。ただし、これは CamlP4 ではなくって
+OCaml のコードを読んで、型定義から関数ソースを生成する独立したフィルタプログラム。
+そしてターゲットは JSON に特化しているみたいだ。まあ、 CamlP4 書くの大変だもんね…
+これは OCaml でウェブ系の仕事しているアメリカ人たちが使っている様子だ。
+
+プログラミング環境
+===============================
+
 Tuareg ★★★★★
-================
+---------------------
 
 Emacs の OCaml コードインデンタとハイライタ。
 
 どちらがいいのかは、正直よくわからない。特に私は toplevel でコード片を eval したりしない人なので…
 Jane Street が Tuareg を使っていて、特に Monad の bind 関係でインデントを整備していたので
 そのあたり、もしかしたら Tuareg のほうが使い勝手が良いこともあるかもしれない。
+(OCaml-indent を作った私としては両方共まーなんかなーなんですけどね)
 
 繰り返しになるけれども、 Tuareg を使っていても caml-types.el や camldebug.el は普通に使えます。
 
-Type-conv, Sexplib, Bin-prot ★★★
-=====================================
+Vim 関連
+-----------------
 
-OCaml-Deriving ★★★
-==========================
+私 Vim 使わないからよくわからないわー。ゴメンナサイ。
 
-Atdgen ★
-===============
+utop ★★★★
+--------------
+
+OCaml の標準の REPL である ocaml toplevel はラインエディタ機能もついていないという
+ミニマル製品なので rlwrap や Emacs の shell モードの中などで実行することで
+エディタ力を強化してやる必要がある。まあこれは Unix 的発想で良いと思うんだけど、
+この頃の若者はそういう寛容さがないから無理を強いられていると感じるのしら。
+
+utop は ocaml toplevel を強化したもの。補完とかカラーつけたりカッコ対応表示したり
+できるそうです…が…何気に必要ライブラリすごくないかい?
+
+私は REPL 使わない派なので使いません。
+ 
+コンパイラテクノロジ寄りの開発強化ツール
+============================================
+
+まあ、なんというか分類しにくいんですが、コンパイラのかっちょいい機能を使った
+カッチョイイ開発ツール達。
+
+OCamlSpotter ★★★★
+-------------------------
+
+名前の定義を探しだすコード解析ツール
+
+人が書いた OCaml コードで、この変数の定義はどこか?とか、この型の定義はどこに?
+とか検索するのは結構骨が折れる。 grep や tags では polymorphism や let shadowning がある
+OCaml ではいくつも候補が出てきてしまい、そういう際にはどれが正しい定義かよくわからなくなってくる。
+
+しかし人間にはわからなくてもコンパイラは全てを知っている。OCamlSpotter はコンパイラがソースを
+コンパイルした際の結果である cmt ファイルを解析し、ソースコードに現れる名前が、どこで定義されたものかを
+解析表示することで、コードを読む際の手間を大幅に短縮するツール。Emacs や Vim からも呼び出すことが
+でき、簡単なキーでカーソルにある名前の定義へとジャンプすることができる。
+
+OCamlSpotter を利用するにはソースコードを -bin-annot というオプションでコンパイルし、 cmt ファイル
+を生成する必要がある。そしてもちろんこの cmt ファイルとソースファイルは消さずに残して置かなければならない。
+ライブラリがインストールされる場合には cmt ファイルも共にインストールする必要がある。
+
+これは私が書いたツールなのだが、私の生計は OCaml プログラミングではなくなった今、あまり以前のように
+ガンガンとメンテする暇がないのが残念。とりあえず最新の OCaml コンパイラでとりあえず動くものは公開しているが
+バグもある(なかなか直らない)。バグは bitbucket の issues 
+( http://bitbucket.org/camlspotter/ocamlspot )に報告してくれれば直す気も出るし、
+パッチはもっと歓迎。
+
+TypeRex ★★★★
+------------------------
+
+Emacs 用の OCaml IDE。
+
+OCamlSpotter と同じような機能にさらに独自ハイライトや
+インデント、リファクタリング(変数名を変更すると同じ変数(同じ名前の変数ではなく、同じ定義を指す変数だけ!を変更してくれる)
+も搭載されている。
+
+実はリファクタリングは OCamlSpotter にもあるし、インデントは OCaml-indent のほうが先だし、
+ちょっとパクられてるなーという被害妄想が私にはある。こういう時 OCaml専業+フレンチコネクションは強い。
+
+問題はプロセスをガンガン作るので Cygwin と相性が悪いってことか。
+Mac OS X ともなにか問題があるようで、 TypeRex が動かなかったら OCamlSpotter も試してみてくれい。
+
+Spotter も TypeRex も使ってない caml-types.el も使ってないとかいう人は
+演習が終わったら OCaml もう使わないほうがいいと思う。 F# とか IDE あるでしょ?
+
+OCaml API Search ★★★
+-----------------------------
+
+型式や名前から関数や型定義を探し出す Webツール。 @mzp さん作。
+http://search.ocaml.jp/
+
+スタンドアローン GUIツールである OCamlBrowser を Web にしたもの。
+OCamlBrowser を Tcl/Tk が無いのでインストールしていない人には便利。
+ただし、 Stdlib と Extlib しか検索できない。
+
+今や OPAM があるので OPAM パッケージを全て対応とかしたら嬉しいんじゃないだろうか。
+そこまで OCamlBrowser/OCaml API Search の検索アルゴリズムがスケールするのか、どうか
+興味もある。
+
+cmigrep ★
+---------------------
+
+cmigrep はコンパイラが生成した cmi ファイルを解析して grep 的にパターンに合致する
+値や型を探し出すコマンドラインツール。
+OCamlBrowser は GUI で面倒、OCaml API Search はサーチスペースが
+どうしても固定されてしまう、という時、 cmigrep だとちょっと取っ掛かりが難しいが、
+網羅的に調べるのに便利といえるかな。
+
+コンパイラ内部依存なので、使用するには各コンパイラごとにちょっとした修正が必要。
+私は自分で 4.00.1 に対応させているけど
+( https://bitbucket.org/camlspotter/cmigrep-fork )、
+確か誰かが同じ事をして公開しているはずです。
+
+OCamlClean ★?
+---------------------
+
+これはぜーーんぜん使ったこと無いのですが、 PIC で OCaml を動かすという
+アホな楽しい OCaPIC project の産物。Dead code elimination を行なって
+バイトコードプログラムの挙動は同じままにサイズを減らしてくれる。
+(OCaml バイトコードコンパイラは使ってないコードもそのままリンクする。
+バイトコードはバイトコードで最適化はほとんど行わないというポリシーなので。)
+js_of_ocaml でもデッドコード消去は行われているはずだけれど、
+これを事前に使うと嬉しいことがあったり、しない?する?
+わかりません。なんで書いときました。
+
+強化ライブラリ
+==============================
+
+この紹介は開発ツールということで、ライブラリの紹介はしないつもりなのだが、
+強化基本ライブラリに関しては例外として紹介する。
+
+OCaml の標準ライブラリはとても貧弱。
+長らく、各人がそれぞれ自分で育てた強化ライブラリを使って仕事をしてきたが、
+さすがにそれではいかんだろうという事で強化された基本ライブラリが幾つか
+発表されている。
+
+Dev はもっとユーザを束ねて基本ライブラリ拡充運動を一本化して行うべきだったと思う。
+正直この辺で手を抜いていたので OCaml 使えねーというイメージが固定化されてしまったのでは
+無いかと思っている… 
 
 Jane Street Core ★★★★
-==============================
+---------------------------
+
+OCaml を使って高頻度金融取引をしている Jane Street Capital が自分達で
+使用するプログラムを開発するにあたって作った強化基本ライブラリ。
+OCaml の標準ライブラリに無かったデータ構造が、あ! Core にはある!
+これも!これも!という嬉しさがよい。
+多分従業員がこれに費やした時間をお金に換算すると億円単位は行ってると思うので
+間違いなく品質は良い。
+
+Jane Street 内での仕様を第一に考えて作ってあるので、少し癖があるところもある。
+例えば、関数の引数で混乱を避けるためにラベル付き引数がふんだんに使用されており、
+人によっては過剰かと思うかもしれないし、至るところ Sexplib による S-式エンコーダ
+が張り巡らされていて一部それを使うことを強制されているところもある。
+また、ライブラリ全体は巨大な core.cmo というファイルにパッケージされるのだが、
+これをプログラムにリンクすると当然実行ファイルも巨大なものになる。
+(この問題は OCaml コンパイラの問題として認識されていて、多分近い将来解決されると思う)
+
+私は… Jane Street で働いているときは当然使っていたけど、
+私が公開しているソフトはライブラリが多く、 Core に依存性を持たせると
+使ってくれる人がいなくなるだろうと思い意識的に避けている。そのかわり、
+Core で得た経験を基に自分用の小さい基本ライブラリを作っている。
+
+他人にリンクされることのないアプリケーションレベルのプログラム開発なら手を出す
+価値は十分にある。
 
 OCaml Batteries Included ★★★★
-==============================
+-----------------------------------
 
+OCaml Batteries Included は Python の Batteries Included から名前をインスパイヤ
+した強化基本ライブラリ。
 
-cmigrep ★
-================
+私は使ったことがない。理由は Jane Street Core に慣れているから。
+なので違いとかもよくわかりません。
+
+Core と Batteries の併用は…わからないけどやめておいたほうがいいと思う。
+両者ともある程度 C言語で書かれた部分もあるから競合しているところがあるかもしれない。
+
+Extlib ★★
+-----------------------------------
+
+Extlib は Batteries Included の基になったより小さい強化基本ライブラリ。
+Batteries をリンクするのは大きすぎて困るが OCaml 標準は足りなさすぎる…
+という時に使うと良い。
+
+強化パーサージェネレータ
+========================
+
+Ulex ★★★★
+------------------
+
+Unicode aware な Lex。ニホンゴガー言うてる人はどうぞ使ってみてください。
+私は使ったこと無い。
 
 Menhir ★★★★★
-==================
+-------------------
 
+強化された OCamlYacc。ほとんど OCamlYacc の上位互換で同じ \*.mly が使えるにも
+関わらず、エラーメッセージが判りやすいうえに OCamlYacc では受け付けない形の
+パースルールも幾つか拾ってくれる、というわけで良いことしか無い。 Yacc 使うなら
+ocamlyacc じゃなくて Menhir。約束だ。
 
-Ulex ★★★★
-==================
-
-utop ★★★★
-================
+テストフレームワーク
+========================
 
 OUnit
+-------------
+
+OCaml-QuickCheck ★?
+--------------------
+
+書いてみただけ。試したこと無い…
+
+https://github.com/camlunity/ocaml-quickcheck
+このフォークが 3.12.x の first class module を使っていて
+少し使いやすいそうだが、自動値生成として type_conv なり deriving 使ってないと
+大変だと思いますが。多分そういうの無いよねこれは…
+
 OCamlViz
-OCamlClean
+--------------
+
+ドキュメントw
+======================
+
 Cheat Sheets
-http://caml.inria.fr/cgi-bin/hump.en.cgi?contrib=766
+-----------------------
+http://www.ocamlpro.com/blog/2011/06/03/cheatsheets.html
+
+OCaml の文法からコンパイラのスイッチ、 Tuareg まで、
+まあ簡単にまとまっていること! 
+
+Tuareg ってこんなに機能あるんですかー、多分1/10も使ってないわ私…
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.