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