Commits

camlspotter  committed 837cb03

uipdate

  • Participants
  • Parent commits b12eecb

Comments (0)

Files changed (1)

File random_memo.rst

 
 http://caml.inria.fr/mantis/view.php?id=1703
 
-Since menhir is a much better alternative to ocamlyacc, we now recommend that all users switch to menhir. At any rate, we do not spend any time on new features for ocamlyacc.
+    Since menhir is a much better alternative to ocamlyacc, we now recommend that all users switch to menhir. At any rate, we do not spend any time on new features for ocamlyacc.
 
 トップレベルで let _ = は使わない
 ======================================
 
     let failwithf fmt = Printf.ksprintf failwith fmt
 
-1モジュール per 1データ型 主義
-======================================
+特殊なリテラルを作りたい
+=================================
 
-重要なデータ型については、そのデータの名前をモジュール名とし、型名は t とする。 t に関する操作はそのモジュール内で行うというプログラミングスタイル::
+CamlP4 で quotation 使う。 <:hoge<自由に書ける>>。 CamlP4 でのレクサ拡張は他の文法拡張と重ねることができないので、うまくいかない。
+Quotation は <:x<>> と最低でも 6 文字必要なので悲しい。
 
-    module Person = struct
+もし可能ならば、パターンマッチは短いケースから書け
+====================================================
 
-      type t = { name : string; age : int; salary : int }
+その方が読みやすい。 None -> ... と Some x -> ... x ... ならば
+大抵 None の方が短いので None から書く。
+大抵である。あなたが今まさに書こうとしている関数はもちろん例外だ。
 
-      let to_string t = Printf.sprintf ppf "name=%s age=%d salary=%d" t.name t.age t.salary
-
-    end
-
-こんな感じで。 type person = { person_name : string; person_age : int; person_salary : int } とか、 person_to_string とかはやらない。
-
-このスタイルの利点は名前空間を open でコントロールしてプログラムを短く書けること、また ML functor と相性がよいことである。
-
-* 普段は { Person.name = "John"; age = 42; salary = 0 } とか Person.to_string と書くが、もし他のモジュールとのバッティングがなければ open Person すれば Person と一々書く必要がなくなる。また、例えば kill_person にすべきか person_kill にすべきかという永遠の問ともおさらばすることができる。とにかくデータ名をモジュールに担当させ、その内部からはデータ名をことごとく省けばよろしい。
-* 共通の同じ型名や関数名が種々のモジュールに使われることになり functor に放り込みやすくなる。例えば::
-
-    module type Printable = sig 
-      type t
-      val to_string : t -> string
-    end
-
-    module F(A : Printable) = struct ... end
-
-こんな感じに定義しておけば上記 Person や他の t と to_string : t -> string を持つモジュールは Printable インターフェースを持つことになり、functor F に放り込むことができる
-
-このスタイルにも不利、というか難しい点はないわけでななく、データモジュール内にデータモジュールを入れ子で作ってしまった場合 t の名前がかぶるので別名を用意しなければならない、とか、再帰データに関するデータモジュールは一度再帰型を普通に定義してからデータモジュールを複数つくるか、それとも再帰モジュールで一気に作るか、とかあるのだが、は試してみれば自ずとわかるのでまあやってみ。
-
-OCaml コンパイラのソースではこのプログラミングスタイルは採用されていないので結構名前が汚いw
-
+もちろん書けない場合もある。安易な入れ替えは死を招く。