OCaml
OCaml面白そうだなぁとか思っているところなのですが、といって使い道もなく。
関数型言語にはいつも惹かれているのですが、使いどころがなくて、結局使わずにいるのです。昔は、Emacsを使っていたのでLispを多少触っていたのですが、最近はWindowsを使っていることがほとんどなので、Emacsもつかわなくなってしまって、関数型言語とは本当に関わらなくなってしまいました。
OCamlは、Blogサーフィンをしているときに見つけたのですが、GTKやTKが使えるということと、実行速度が速そうだということで気になったのですが。
具体的には、Linuxプラットフォームに戻ったときに、使えるかなと思っています。具体的には、Cobalt Web BuilderのLinux移植にからむ話ですね。まあ、Kylixの方が移植しやすいはずなので、わざわざ一から書かなくてもという話もあるのですが。
ああ、そのうち、Kobold EngineをOCamlに移植するというのもいいかもしれない。なんの意味があるか? ただの趣味ですね。
ところで、OCamlの簡単なガイドを読んでいて面白いと思った部分。
http://ocaml.jp/archive/document/intro1.html
これをみて、C のプログラマは「そんなに何回も関数を呼んでループするなんて、関数のオーバヘッドがもったいない!」というだろう。大丈夫。OCaml には末尾呼び出し (tail call) が実装されている。今までの環境を引き継ぐことなく関数を呼び出す場合、call ではなく jmp することにより、再帰関数がアセンブリレベルでは単なるループに落ちる。
1 から n までの和を計算する場合、通常は次の様に書きがちだ。# let rec sum n = if n <= 0 then 0 else n + sum (n - 1) ;; val sum : int -> int = <fun> # sum 10;; - : int = 55これでは sum から返って来ても呼び出し側の sum で足し算の作業をしなければならないので、末尾再帰にならない。末尾再帰にならない場合は普通の関数コールと同じコストがかかる。これを末尾再帰にするには次の様に新しい関数を作る。
iter 内で関数 iter を呼んだ後、何もしていないことに注意して欲しい。すなわち、関数 iter の値が、iter の中で呼んだ iter の値と等しい。これが末尾再帰である。# let sum n = let rec iter i s = if i <= 0 then s else iter (i - 1) (s + i) in iter n 0 ;; val sum : int -> int = <fun> # sum 10;; - : int = 55