Commits

camlspotter committed a6c18de

update

Comments (0)

Files changed (1)

 OCaml を使うなら Unix で
 ===============================================
 
-要するに Linux とか Mac OS X とかを使ってください。
-一言で言うと Windows では使わない。時間の無駄です。理由は、
+要するに Linux とか Mac OS X とかを使って。
+一言で言うと Windows では使わない。時間の無駄。理由は、
 
 * Cygwin, Mingw, MS native の三種類ありそれぞれ使える機能、出来たコードのライセンス、スピード特性が違う
-* Windows というとコンパイラバイナリパッケージに頼る人が続出し、そしてあまり出来が良くない。OCaml できる人はコンパイラは自分でビルドするのでバイナリパッケージ固有の問題はできる人には共有されていないというか他人事です
+* Windows というとコンパイラバイナリパッケージに頼る人が続出し、そしてあまり出来が良くない。OCaml できる人はコンパイラは自分でビルドするのでバイナリパッケージ固有の問題はできる人には共有されていないというか他人事
 * どの種類を使ってもコンパイラ Cygwin をビルドツールとして使う。Cygwin は頑張っているが、まあ、 Unix の真似事に過ぎないのでバッドノウハウは沢山ある
-* 外部ライブラリのインストール、アンインストールが一々面倒でしょう?
+* 外部ライブラリのインストール、アンインストールが一々面倒
 * そういうわけでユーザーが少ない。上記三種類のせいで、少ないユーザーが更に分断されている。何かあっても誰も助けてくれない。
 
-もちろんこの問題はほとんどが Windows は Unix 系プログラムを持ってきて作業するにはあまりにも辛すぎる、という事に起因するわけで、 OCaml がダメだというわけではありません。普通に Windows で OCaml のプログラム開発してビジネスしているところはあります。ただ、それは顧客が金払ってくれるからで… 趣味の範囲で、中級以上の作業(初級とは ocaml トップレベルとか簡単な ocamlc 単発使用とかそんなレベル)はとても面倒です。まあやめておいたほうが良い。
+もちろんこの問題はほとんどが Windows は Unix 系プログラムを持ってきて作業するにはあまりにも辛すぎる、
+という事に起因する。OCaml がダメだというわけではない。普通に Windows で OCaml のプログラム開発してビジネスしているところはある。あるが、それは顧客が金払ってくれるからで… 趣味の範囲で、中級以上の作業(初級とは ocaml トップレベルとか簡単な ocamlc 単発使用とかそんなレベル)はとても面倒。まあやめておいたほうが良い。
+
+長い module type を ``\*.ml`` と ``\*.mli`` で繰り返すのが面倒なら ``\*_intf.ml`` を書く
+===========================================================================================
+
+モジュール型とそれに関連するコードを書いていて、モジュール型が長くなると
+``\*.ml`` ファイルにも ``\*.mli`` ファイルにもそのモジュール型を書かなければならなくなり、
+とても面倒になる。そういった場合はモジュール型の定義だけを外に出してしまうとよい。
+
+例えば、 ``\*_intf.ml`` というファイルに。 ``\*`` というモジュールに関するインターフェースを
+定義する、というくらいの意味の名前。ここにはモジュール型の定義のみを書くことにすれば
+隠蔽の必要もないので ``\*_intf.mli`` を書く必要もない。
+
+
+ラベル付き引数の使い方 (非オプション)
+========================================================================
+
+別に好きに使っていいんだけど、次のような時に便利
+
+同じ型の引数を複数取る関数で、その引数の意味を型上にドキュメントとして区別したい
+    例えば ``String.blit`` の型を覚えるのは大変だし、間違ったらかなりヤバイので
+    型にラベルを付けて嫌でもユーザーに認識させる::
+
+        (* ラベルなし String にある *)
+        val blit :     string ->         int ->     string ->         int ->     int -> unit
+
+        (* ラベルあり。 StringLabels に定義されている *)
+        val blit : src:string -> src_pos:int -> dst:string -> dst_pos:int -> len:int -> unit
+
+引数の順序を自由に変えてコードを読みやすくしたい場合
+    基本的に短く書ける引数を先に書いたほうがプログラムは読みやすい。
+    ``List.map`` などのように高階関数引数はダラダラっと長く、最後に一言リスト引数が書いてある
+    と、えっと ``map`` の対象になるリストはドコドコドコドコ?となる。ならば入れ替えて
+    始めに書けると嬉しい。慣例上、高階関数のラベルを ``f`` にする::
+
+        List.map (fun x ->
+            何行でも書けばいいさ
+            ...                        えーっと map の対象はどこ?
+            何行でも書けばいいさ
+          ) xs                         <- あっ、こんなところに
+
+        (* ラベル付き引数で読みやすくした ListLabels.map *)
+        ListLabels.map xs ~f:(fun x ->     <- えーと、xs をとにかくナンカスルのね。
+            何行でも書けばいいさ
+            ...
+            何行でも書けばいいさ
+          )
 
 Ocaml と書く奴は OCaml 使わんでいい
 ============================================