Commits

camlspotter committed 2c3accb

update

  • Participants
  • Parent commits 35236a6

Comments (0)

Files changed (2)

ocaml-ext-tools.rst

 内部もしくは外部開発されたのツール群の紹介を行う。
 例によって多岐に渡るので、一つ一つの詳しい説明は行わない。
 各ツールの細かい情報はそれぞれのドキュメントを参照して欲しい。
-リンクは貼るの面倒だからググ
+リンクは貼るの面倒だからググって。
 
 もし知らないツール名があったらちょっと読んでみて欲しい。
 もしかしたらあなたの問題を解決するツールがあるかもしれないから。
 ライブラリとツールの中間のようなコード生成系も取り上げた。
 あくまでも基本的に私が触ったことのある物しか紹介しないから、
-そっけなかったりするのはあまり触ってないということです。
-なんでこれはなんで取り上げてないの?と思ったら、それは使ったことないからです。ごめんね。
+そっけなかったりするのはあまり触ってないということ。
+なんでこれはなんで取り上げてないの?と思ったら、それは使ったことないから。ごめんね。
 不満があったら自分で紹介記事書いてください夜露死苦!
 
 ★は重要度。五点満点。
 コンパイラ同梱のツールの紹介はもうした。
 http://d.hatena.ne.jp/camlspotter/20121204/1354588576
 
-@tmaeda さんも既に似たようなのを更に詳しく書いてたなあ
+@tmaeda さんも既に似たようなのを更に詳しく書いてた…
 http://tmaeda.s45.xrea.com/td/20121028.html
 
 ビルド関連
 * Makefile よりも随分マシなセマンティックスな言語。関数による際利用可能なビルドルール記述
 * ファイル更新時ではなくファイルのチェックサムによるリビルド。更新されたが変化はなかった自動生成ファイルの不要なコンパイルが行われない
 * サブディレクトリでのビルドが楽
+* 依存関係を解析して複数コアを使った並列ビルドが簡単
 * ``-P`` スイッチによるファイル変更時の自動リビルド
 * OCaml プログラムビルドのための便利な機能がもともと入っているので、OCaml のための複雑な関数記述が不要
 * LaTeX や C のルールももうある
 私は OCaml のプログラムは今のところ OMake を使っている。スケール感半端無いので。問題がないわけではない:
 
 * スコープルールが特殊。ビルドのために便利なようになっているらしいが、わかったようなわからないような、である
-* 依存関係を完全に抑える努力をしないと無駄なリビルドが発生する
-* お仕着せの OCaml ビルドルールで満足できなくなると関数を沢山書き始めて辛い
+* 依存関係を完全に抑えなければいけない。さもないと1コアだとコンパイルできるけど複数コアだとビルドに失敗する
+* お仕着せの OCaml ビルドルールで満足できなくなると関数を沢山書き始めなければならない。あまり嬉しくない。
 * ld as needed と相性が悪く ``-P`` のビルドが上手くいかない人が ( http://d.hatena.ne.jp/camlspotter/20121002/1349162772 )
 
-とはいえ小さい OCaml プロジェクトの OMakefile はあっけないほど簡単に書けるので使ってみると良い。(まあこれは OCamlBuild にも言えることなんだけどね)
+それでも小さい OCaml プロジェクトの OMakefile はあっけないほど簡単に書けるので使ってみてほしい。
+(まあこれは OCamlBuild にも言えることなんだけどね)
 
 OCamlMakefile ★★
 ------------------------------
 OCaml のための Makefile マクロ集
 
 OMake や OCamlBuild みたいな新しい物を覚えるのは年を取ってしまってどうも…という人は
-OCamlMakefile という OCaml プログラムをビルドする際に便利なマクロが詰まった OCamlMakefile
-を使うと良い、が、 OCamlMakefile のマクロを覚えるコストと OMake や OCamlBuild の初歩を
+OCamlMakefile という OCaml プログラムをビルドする際に便利なマクロが詰まった Makefile
+を使うと良い。が、 OCamlMakefile のマクロを覚えるコストと OMake や OCamlBuild の初歩を
 学ぶコストはどちらが小さいか。
 
 私は5日程使った記憶がある
 あまり提唱しなかった。そのため、作ったライブラリは ``ocamlc -where`` で表示される
 OCaml 標準ライブラリがインストールされている場所に直接放り込む、とか、
 まあそこに hogehoge ライブラリなら ``hogehoge`` というディレクトリを掘ってそのこに
-り込む、とか、各人が思い思いにインストールしていたのだった。
+放んでり込む、とか、各人が思い思いにインストールしていたのだった。
 
 またライブラリを実際に使用して実行プログラムにリンクする際のコンパイラフラッグの管理
 も大変だった。もし hogehoge というライブラリを使いたいとすれば、 ``hogehoge.cma``
 も一緒にコンパイラに渡してやらなければならない。もちろんこれは丁寧に Makefile を書いて
 再利用できるようにしておけば何の問題もないのだが、まあ、面倒だった。
 
-OCamlFind はこの二つの点を次のように解決する::
+OCamlFind はこの二つの点を次のように解決する:
 
 * ライブラリ(群)をパッケージとして扱い、パッケージ名による管理を可能にする
 * パッケージ管理者は各ライブラリの依存関係をパッケージの ``META`` ファイルに記述
 * OCamlFind は OCaml コンパイラのラッパとして動作、使用するライブラリ名を渡すと必要なスイッチをコンパイラに自動的に渡す
 
-例えば、今私がいじっている OCamltter を改造したライブラリの一ビルドコマンドにこんなのがある::
+例えば、今私がいじっている OCamltter を改造したライブラリをビルドすると
+こんなコマンドが発行される::
 
     ocamlfind ocamlc \
        -for-pack Twitter \
 ``-package ...`` とか ``-syntax ...`` のオプションは OCamlFind に 
 cryptkit, str ,sexplib, spotlib, tiny_json_conv
 というパッケージを使うこと、拡張文法として camlp4o を使うこと、
-そして文法プラグインとして sexplib.syntax と meta_conv.syntax を使うことを支持している。
-それ以外は ocamlc にある普通のオプション。え、これで既に長いですって?
+そして文法プラグインとして sexplib.syntax と meta_conv.syntax を使うことを指示している。
+それ以外は ocamlc にある普通のオプション。え、これで既に長いって?
 
-上のコマンドから OCamlFind が実際にどのような ocamlc コマンドを発行しているか、 -verbose オプションを付けてみれば、表示してくれる::
+上のコマンドから OCamlFind が実際にどのような ocamlc コマンドを発行しているか、
+-verbose オプションを付けてると、表示してくれる::
 
     ocamlfind ocamlc -verbose ... (上と同じ)
     + ocamlc.opt -verbose -for-pack Twitter -w A-4-9-27-29-32-33-34-39 -warn-error A-4-9-27-29-32-33-34-39 -g \
 
 OCamlFind は OCaml のライブラリを駆使するものはまず使う必須ツールなので、
 ちょっとややこしいことをする場合は使ったほうがいい。
+
 ちなみに OCamlFind は Findlib というライブラリの上に作られたツールなので自分自身の OCamlFind パッケージ名は findlib。なのに OPAM パッケージ名は ocamlfind というちょっと変な名付けになってる。
 
-OCamlFind, 便利なんだけど、さらに camlp4 のラッピングをしてコード展開を楽にしてくれるととても嬉しいのだが、そんな機能はないのだなあ。
+OCamlFind, 便利なんだけど、さらに camlp4 のラッピングをしてコード展開を楽にしてくれるととても嬉しいのだが、
+そんな機能はないのだなあ。 P4 の結果を調べるときには、いちいちコマンドを手打ちしなければならない。
 
 パッケージシステム
 ========================
 
+この数年 OCaml界ではパッケージが熱い。
+
 Oasis ★★★
 -------------------------
 
 ビルドするには、インストールするには、アンインストールには、どんなコマンドを発行するか、を記述する。
 コマンドはシェルで解釈されるので ``ocaml setup.ml`` だろうが configure + make だろうが
 ``ocamlbuild`` だろうが ``omake`` だろうが何でもかまわない。
+これは Oasis がそのあたり便利にしようとしてコケている事への反省だと思う。
 
 さらに、パッケージが別パッケージのどのバージョンに依存しているかも ``opam`` ファイルに記述するのだが
 この際のアルゴリズムとして Debian のパッケージと同じアルゴリズムが使われている、まあ枯れていて強力
 
 Oasis でビルド方法を統一してあるので、 ``build`` と ``remove`` ルールはいつも同じ。
 依存情報である ``depends`` と ``ocaml-version`` を書き換えるくらいしかしない。
+というわけでなんだかんだ言って Oasis は使えるところは使えるのである。
 
 この ``opam`` ファイルに加え、ソフトウェアの説明を記述した ``descr``、ソフトウェアの tarball
 をどこに置いたか、そしてそのチェックサムを記録した ``url`` この三点セットのファイルで一つのパッケージ
 情報になる。これを opam-repository のレポに置けば誰もがそこから三点セットをダウンロードして
-opam コマンドで OCaml ソフトウェアを簡単にインストールできるというのが売りだ。自分で OPAM パッケージ
+opam コマンドで OCaml ソフトウェアを簡単にインストールできる。自分で OPAM パッケージ
 を作る場合はこの公式レポを fork して変更の pull request を送れば良い。平日なら日本の午前に出せば
 夕方には取り込まれる。
 
 * Oasis で OMakefile を呼び出す setup.ml を作る
 * ソースと setup.ml をレポに上げてバージョンのブランチなりタグを作る
 * ブランチもしくはタグに対応する tarball を url に書いて opam, descr と一緒に OPAM レポに pull request
+* アップデートリリースのアナウンスは面倒だからしないw opam update したらそこに見つかるだろうから
  
 GODI ★?
 --------------------
 が、まず CamlIDL のチュートリアルから。
 
 まあスタブが10個くらいですむなら私は手で書く。ちゃんと OCaml ランタイムのことがわかっていれば
-手書きでもそう間違いはおこらないはずだ。
+手書きでもそう間違いはおこらないはずだ。スタブが100個とかになると CamlIDL や
+自分で頑張ってコード生成器を書くか (LablGtk2 など) 工夫してやることになる。
 
 Type_conv, Sexplib, Bin_prot ★★★
 -------------------------------------
 上の例でもわかるようにコンストラクタ名や型引数の違いはあるが、``show_t`` も
 ``show_t'`` も基本的にやってることは同じ。完全にルーチンワークだ。
 こういったルーチンワーク(Boiler plate code)は書きたくない、できればコンパイラに
-自動生成させたいというのが人の常で、type_conv はこういった型構造で自然と決まるコード
+自動生成させたいというのが人の常で、type_conv はこういった型の代数的構造から自然と決まるコード
 の自動生成を支援するための CamlP4 フレームワーク。type_conv では type 宣言が拡張されていて
 ``with <名前>`` というのをくっつけることができる::
 
 
 こう書くと type_conv は ``show`` という名前で登録されたコード生成モジュールを
 呼び出して型定義情報を与える、生成モジュールはやはり P4 で書かれていて例えば
-上の ``show_t`` や ``show_t'`` を生成する、という具合だ。もちろん生成モジュール
+上の ``show_t`` や ``show_t'`` を生成する。もちろん生成モジュール
 は誰かが書かねばならない。 まあ、 Haskell の deriving をよりプログラマブルに
 倒したものと考えれば当たっているだろう。
 
 (もちろん S-式の形でプリントされるので読みにくいかもしれないが、
 慣れれば結構読めるものである)
 
-type_conv 以下は Jane Street 謹製なので安心です
+type_conv 以下は Jane Street 謹製なので安心。
 
 問題は自分で生成モジュールを作るのは P4 プログラミングを伴うので結構大変ってこと。
-自作が面倒なら sexp で手を打つのが楽。 Sexplib はかなりちゃんとドキュメントが書かれている。
+自作が面倒なら sexp の S-式から何とかするのが楽。
+Sexplib はかなりちゃんとドキュメントが書かれている。
 
 OCaml-Deriving ★★★
 --------------------------
 で使われている。 Type_conv と OCaml_deriving が共存できるかどうかは、知らない。
 
 OCaml-deriving は show がすでにあるのが嬉しいかな。まあ type_conv でも meta_conv
-使って ``with conv(ocaml)`` すれば同じ事出来ますけどね。
+使って ``with conv(ocaml)`` すれば同じ事出来けどね。
 
 Atdgen ★
 -------------------
 
 繰り返しになるけれども、 Tuareg を使っていても caml-types.el や camldebug.el は普通に使えます。
 
+後述する Cheat Sheet によれば、Tuareg ってなんかすごくキーショートカットがある、
+多分1/10も使ってないわ私…
+
 Vim 関連
 -----------------
 
 私 Vim 使わないからよくわからないわー。ゴメンナサイ。
 
-utop ★★★★
+* ocaml.vim とか omlet.vim とか聞きますね。どちらがいいんでしょうね。
+* ocaml-annot という caml-types.el に相当するもの (http://blog.probsteide.com/getting-started-with-ocaml-and-vim)
+* https://github.com/MarcWeber/vim-addon-ocaml
+* OCamlSpotter にも一応、 ocamlspot.vim てものがあるけど、私使わないから…直してみてよ
+ 
+utop ★★★
 --------------
 
 OCaml の標準の REPL である ocaml toplevel はラインエディタ機能もついていないという
 
 OCamlSpotter と同じような機能にさらに独自ハイライトや
 インデント、リファクタリング(変数名を変更すると同じ変数(同じ名前の変数ではなく、同じ定義を指す変数だけ!を変更してくれる)
-も搭載されている。
-
-実はリファクタリングは OCamlSpotter にもあるし、インデントは OCaml-indent のほうが先だし、
-ちょっとパクられてるなーという被害妄想が私にはある。こういう時 OCaml専業+フレンチコネクションは強い。
+も搭載されている。うまく動けば超強力らしい。
 
 問題は設計がこりすぎていて、Mac OS X となにか問題があるようで、動かなかったりする。
 TypeRex が動かなかったら OCamlSpotter も試してみてくれい。
 OCamlClean ★?
 ---------------------
 
-これはぜーーんぜん使ったこと無いのですが、 PIC で OCaml を動かすという
+これはぜーーんぜん使ったこと無いのが、 PIC で OCaml を動かすという
 OCaPIC project の産物。Dead code elimination を行なって
 バイトコードプログラムの挙動は同じままにサイズを減らしてくれる。
 (OCaml バイトコードコンパイラは使ってないコードもそのままリンクする。
 バイトコードはバイトコードで最適化はほとんど行わないというポリシーなので。)
 js_of_ocaml でもデッドコード消去は行われているはずだけれど、
 これを事前に使うと嬉しいことがあったり、しない?する?
-わかりません。なんで書いときました。
+わかりません。なんで書いとた。
 
 強化ライブラリ
 ==============================
 インスパイヤされた強化基本ライブラリ。
 
 私は使ったことがない。理由は Jane Street Core に慣れているから。
-なので違いとかもよくわかりません
+なので違いとかもよくわからない
 
 Core と Batteries の併用は…わからないけどやめておいたほうがいいと思う。
-両者ともある程度 C言語で書かれた部分もあるから競合しているところがあるかもしれない。
+結構機能的に重複があるし、Core は C言語で書かれた部分もあるから競合しているところがあるかもしれない。
 
 Extlib ★★
 -----------------------------------
 テストフレームワーク
 ========================
 
-OUnit
+OUnit ★★★
 -------------
 
 ユニットテストライブラリ
 
 テストは簡単には assert でやるもんですが、それが沢山になってくると、どのテストが通ったかとかどれが通ってないとか
-調べたくなるものです。OUnit はベタな assert を organized な物にするためのライブラリ。
+調べたくなるもの。OUnit はベタな assert を organized な物にするためのライブラリ。
 
 テストの元になってる最小単位は ``test_fun``、要は ``unit -> unit`` でエラーの場合は ``Failure`` 例外を上げる
 関数。これを ``(>::)`` で名前をつけて ``test`` にしてやる。複数の ``test`` を ``(>:::)``
 このフォークが 3.12.x の first class module を使っていて
 その辞書飛ばしの部分は少し使いやすいそうだ。
 しかし、自動値生成として type_conv なり deriving 使ってないと
-大変だと思いますが。多分そういうの無いよねこれは…
+大変だと思。多分そういうの無いよねこれは…
 
 ドキュメントw
 ======================
 
 OCaml 関連のカンニングペーパー。文法からコンパイラのスイッチ、 Tuareg まで、
 まあ簡単にまとまっていること! 
-
-Tuareg ってこんなに機能あるんですかー、多分1/10も使ってないわ私…

one-data-type-one-module.rst

 * 一々 employee employee, product product 書くの面倒くさい
 * 統一感がない。salary も employee_salary、 price も product_price にすべき
 
-確かに、これでは r.employee_name, r.product_id, employee_to_string, product_to_string と書くことになります。OCaml のレコードは単相ですし、値は overloading が無いので名前を被せることができないのですね。え? 
+確かに、これでは r.employee_name, r.product_id, employee_to_string, product_to_string と書くことになります。OCaml のレコードは単相ですし、値は overloading が無いので名前を被せることができないのですね。 
 
 このコード、「1モジュール1データ型スタイル」で書きかえると次のようになります。::
 
 
     open Employee  (* 以降、 r.name, r.id, to_string は Employee.t の操作の事になる *)  
     
-いや待て、そもそも employee と product は同じモジュールで定義されている、つまり混ぜて使う事を想定されているのだから、open Employee と open Product は同時には使えないではないか。うむ、たしかに。open を二つ並べると、後の open の名前の方が優先されます。しかしそういう場合は local open を使えばよい。名前空間の操作がローカルに調整できます。::
+いや待て、そもそも employee と product は同じモジュールで定義されている、つまり混ぜて使う事を想定されている。open Employee か open Product は同時には使えないではないか。うむ、たしかに。open を二つ並べると、後の open の名前の方が優先されます。前の open の効力は無くなる。しかしそういう場合は local open を使えばよい。名前空間の操作がローカルに調整できます。::
 
     let fire e = 
       let open Employee in (* fire 関数中のみ、Employee を書かなくてよくなる *)