Commits

camlspotter committed 209a2ee

update

  • Participants
  • Parent commits d7e58ff

Comments (0)

Files changed (1)

File random_memo.rst

     let () = ignore (List.iter f)          (* ほんとに意味はないけど俺はわかってやっているんだ!! *)
 
 ``fun x -> match x with`` は ``function`` にしろ
-=============================================
+========================================================
 
 ``let f x = match x with`` でも同様。まあ同じといえば同じだけれども文化的に ``function`` 推奨。
 
 Jane Street Core や OCaml batteries included などの末尾再帰版を使うか自分で末尾再帰版を定義する。
 
 副作用を起こす式を関数引数に直接書かない。 ``let`` で受ける
-=======================================================
+====================================================================
 
 OCaml の引数評価順は未定義。そして実際には i386 では外から(右から)行われるため、
 直感とずれる場合があり、ハマる::
 ポイントフリー教徒はより頻繁にハマるであろう。
 
 ``raise Exit``, ``raise Not_found`` でコードが読みやすくなるなら使う
-==============================================================
+========================================================================
 
 例外による再帰関数からの大域脱出は OCaml ではランタイムのペナルティはほとんどないので、 
 ``try with`` を書いてそれでもコードが読みやすければ使って構わない。
         | x::_ when p x -> true
         | _::xs -> exists p xs
 
-この関数型的コードは同じである。どちらが好まれるかは、もちろん後者である。前者のように書いていても構わないが…
+この関数型的コードは同じである。どちらが好まれるかは、もちろん後者である。
+前者のように書いていても構わないが…
 OCaml を書き続けるならどこかで努力をして後者に切り替えるべきである。
 
 カスタム printf の作り方
 が到達したかわからない場合に便利、というか常に ``b`` を入れとけ。わかったか。
 
 Physical comparison ``(==)``  ``(!=)``  で泣く位なら始めから締めだす
-==============================================================
+==========================================================================
 
 自分が ``(=)``, ``(<>)`` と ``(==)``, ``(!=)`` の違いが判らないとか、同僚が判らない場合は
 もうさっさと ``(==)`` と ``(!=)`` は潰したほうがいい。Jane Street Core のように::
 
 どうぞご随意に、自分で定義できますよね?というのが OCaml スタイル。
 
-OCaml では記号の結合方向や強さは固定されているので、変更することができない。
-これを使えない、と見るか、妙な結合方向や強さを持つ記号を大量生産されないようにしているか、と見るか、
-だが、兎に角現実として固定されいているのでまずそれを列挙しておこう。
+OCaml では記号の結合方向や強さは主にその位置文字目の記号によって固定されており、
+変更することができない。
+これを使えない、と見るか、
+妙な結合方向や強さを持つ記号を大量生産されないようにしているか
+(どこかに記載されている結合方向と強さを調べないと
+人間が理解以前にパースさえできないコードってどうなんですかね?)、
+と見るか、だが、兎に角現実として固定されいているのでまず
+それを列挙しておこう。
 
 下にいくほど強くなる
 
 少なくともあなた自身には便利なものを作らなければいけない。
 幾つかよく使われる物を挙げておく:
 
-Monadic bind ``>>=`` はそのまま使えば良い。 Jane Street では ``>>|`` を fmap として使っている。
+Monadic bind ``>>=``
+    Monadic bind ``>>=`` はそのまま使えば良い。 Jane Street では ``>>|`` を fmap として使っている。
 
-F# の ``|>`` はそのまま使えば良い。ただしパフォーマンスのために "%revapply" を使う::
+Pipe ``|>``
+    F# の ``|>`` はそのまま使えば良い。ただしパフォーマンスのために "%revapply" を使う::
 
-  external (|>) : 'a -> ('a -> 'b) -> 'b = "%revapply"
+        external (|>) : 'a -> ('a -> 'b) -> 'b = "%revapply"
 
-Haskell の ``$`` は右結合で結合力は最も弱い0。 OCaml では ``$`` は左結合なので使えない。
-これは右結合 ``&`` をお薦めする。Logical AND は logical OR が ``||`` なため、皆 ``&&`` を使い、
-``&`` は使わないので使ってしまって良い。
-``|>`` と同じくパフォーマンスのために "%apply" を使う::
+Haskell's ``$``
+    Haskell の ``$`` は右結合で結合力は最も弱い0。 OCaml では ``$`` は左結合なので使えない。
+    これは右結合 ``&`` をお薦めする。Logical AND は logical OR が ``||`` なため、皆 ``&&`` を使い、
+    ``&`` は使わないので使ってしまって良い。
+    ``|>`` と同じくパフォーマンスのために "%apply" を使う::
 
-  external (&) : 'a -> ('a -> 'b) -> 'b = "%apply"
+        external (&) : 'a -> ('a -> 'b) -> 'b = "%apply"
 
-残念ながら ``|>`` は ``&`` より強いので ``f & g x |> h`` は ``f & (g x |> h)`` とパースされてしまう。
-見た目的には ``|>`` の方が分断感あるので ``(f & g x) |> h`` となって欲しいところ。
-このためかどうか、 ITPL な人は ``|>`` の代わりに ``@@`` を使っているが、
-今度は、 ``>>=`` との強さ関係が (Haskell の ``$`` と ``>>=`` とは)逆になる。痛し痒しである。
-まあ、 ``(f & g x) |> h`` は ``g x |> f |> h`` と書けば問題ない。
-Jane Street は ``%apply`` として ``|!`` を使っている。
+    残念ながら ``|>`` は ``&`` より強いので ``f & g x |> h`` は ``f & (g x |> h)`` とパースされてしまう。
+    見た目的には ``|>`` の方が分断感あるので ``(f & g x) |> h`` となって欲しいところ。
+    このためかどうか、 ITPL な人は ``|>`` の代わりに ``@@`` を使っているが、
+    今度は、 ``>>=`` との強さ関係が (Haskell の ``$`` と ``>>=`` とは)逆になる。痛し痒しである。
+    まあ、 ``(f & g x) |> h`` は ``g x |> f |> h`` と書けば問題ない。
+    Jane Street は ``%apply`` として ``|!`` を使っている。
 
-関数合成 (Haskell の ``.``) は右結合でかなり強くなければいけない。 ``**`` を
-使うのが良いと思う。当然、数値計算の ``**`` と合成の ``**`` を同時に使うことはできないので
-そこは場合によってよく使う方を選ぶことになる。私は数値の ``**`` はほとんど使わないので
-``let power = ( ** )`` としている。
+Functional composition
+    関数合成 (Haskell の ``.``) は右結合でかなり強くなければいけない。 ``**`` を
+    使うのが良いと思う。当然、数値計算の ``**`` と合成の ``**`` を同時に使うことはできないので
+    そこは場合によってよく使う方を選ぶことになる。私は数値の ``**`` はほとんど使わないので
+    ``let power = ( ** )`` としている。
 
-ITPL の人は ``!%`` を ``Printf.sprintf`` に使っている。 ``%`` は format 文の意か。
+Others
+    ITPL の人は ``!%`` を ``Printf.sprintf`` に使っている。 ``%`` は format 文の意か。
 
 ``ocamlopt`` を使いましょうね
 ============================================
 
 ``ocamlc`` でコンパイルして OCaml 遅いと言わない…約束だ。
 
+OCaml を使うなら Unix で
+===============================================
+
+要するに Linux とか Mac OS X とかを使ってください。
+一言で言うと Windows では使わない。時間の無駄です。理由は、
+
+* Cygwin, Mingw, MS native の三種類ありそれぞれ使える機能、出来たコードのライセンス、スピード特性が違う
+* Windows というとコンパイラバイナリパッケージに頼る人が続出し、そしてあまり出来が良くない。OCaml できる人はコンパイラは自分でビルドするのでバイナリパッケージ固有の問題はできる人には共有されていないというか他人事です
+* どの種類を使ってもコンパイラ Cygwin をビルドツールとして使う。Cygwin は頑張っているが、まあ、 Unix の真似事に過ぎないのでバッドノウハウは沢山ある
+* 外部ライブラリのインストール、アンインストールが一々面倒でしょう?
+* そういうわけでユーザーが少ない。上記三種類のせいで、少ないユーザーが更に分断されている。何かあっても誰も助けてくれない。
+
+もちろんこの問題はほとんどが Windows は Unix 系プログラムを持ってきて作業するにはあまりにも辛すぎる、という事に起因するわけで、 OCaml がダメだというわけではありません。普通に Windows で OCaml のプログラム開発してビジネスしているところはあります。ただ、それは顧客が金払ってくれるからで… 趣味の範囲で、中級以上の作業(初級とは ocaml トップレベルとか簡単な ocamlc 単発使用とかそんなレベル)はとても面倒です。まあやめておいたほうが良い。
+
+Ocaml と書く奴は OCaml 使わんでいい
+============================================
+
+以上。