入門Haskell」、「入門Common Lisp」に続く 毎日コミュニケーションズの「入門ほげ言語」第三弾が、こちら。

本書「入門OCaml」は、読んで字のごとく、OCaml言語の入門書。

目次 - MYCOM BOOKS - 入門OCaml 〜プログラミング基礎と実践理解〜より抜粋。
  • 1章 OCamlに触れる
  • 2章 言語の基礎
  • 3章 型を理解する
  • 4章 モジュールシステム
  • 5章 オブジェクト指向機能
  • 6章 標準ライブラリの利用
  • 7章 OCamlで作ってみよう 〜MySQLと連係したバグトラックシステム〜
  • 8章 OCamlあれこれ散策

で、OCamlはどんな言語かというと、こんな感じの言語。

let fizzbuzz n =
  let fizz = if n mod 3 == 0 then "Fizz" else "" in
  let buzz = if n mod 5 == 0 then "Buzz" else "" in
  if [] != List.filter (fun s -> String.length s != 0) [fizz;buzz]
     then fizz ^ buzz
     else string_of_int n

let puts s = print_string( s ^ "\n");;

for i = 1 to 100 do
  puts (fizzbuzz i)
done;;

同じような感じでHaskellで書くと、こんな感じ。

main = mapM_ (putStrLn . fizzbuzz) [1..100]

fizzbuzz n
   = if or $ map (\s->length s /= 0) [fizz, buzz] 
        then fizz ++ buzz 
        else show n
     where fizz = if mod n 3 == 0 then "Fizz" else ""
           buzz = if mod n 5 == 0 then "Buzz" else ""

双方ともそれぞれの言語っぽさを出すような書き方にしてみた。とはいっても、OCamlは私はほとんど使った事がないので、「こんな感じ」は本書を読了した上でのとりあえずの感想なのだけど。

本として見た場合、「入門ほげ言語」の中では、一番よく書けていると思う。特にコラムの使い方がうまい。「;;ってなんだよ〜」という不満が最高潮に達したところでなぜ;;なのかを解説したり、memoizeを実装してみたりと、読者があくびが出そうなところにコラムが挿入されていることで、この手の本としては珍しく頭から尻までノンストップで読み通しても疲れないようになっている。

なのだけど....このOCaml、私の手にはどうもなじみにくい。言語としてのとんがり度がHaskellほどではないということもある(その代わり、見ての通りふつうのfor loopもある)。しかし記号の使い方が、普段浸かっている言語と違い過ぎる。erlangの記法が自然に思えるほど。Listが[1;2;...;n]はまだよしとして、Arrayが[|1,2,...,n|]というのはちょっとなあ。

よごれちまったヲッサンにはちょっときついけど、まだ「実用言語」に染まっていないワカモノには結構進めてもいいのではないかとちょっと感じた。「かっこなしのLisp」という点では、PythonよりもOCamlの方が近いのではないかと。でも、これだけ記号の使い方が他と違う(* 強いて言えばPascalに近いのかな....*)と、「現場言語」アレルギーになっちゃわないかと余計な心配もしたり....

願わくば、「入門Haskell」の前に本書が出ていて欲しかった。

Dan the Camel, not OCaml, (Ab)?user