2011年3月27日日曜日

Konnichiwa OCaml

Goの言語仕様が変わって周辺ライブラリのコンパイルが通らなくなったので、とりあえずGoは放置してOCamlでThriftを試すことにした。その前段階としてOCamlの適当なサンプルでも書いてみる。

OCaml自体は結構前から知ってたけど、使う機会も無いしなんとなく書きかたが気持ちわるかったから敬遠してた。まあこの際だから試そう。

環境のセットアップ

Ubuntuならラクチン。

$ sudo apt-get install ocaml ocaml-mode

hello.ml

(* util functions *)
let concat (x, y) = 
  x ^ " " ^ y;;

(* main function *)
let msg = "konnichiwa" in
let name = "aardvark" in
let con = concat(msg, name) in
    print_endline con ;;

Makefile

コンパイルすると*.cmiというインタフェースの情報を記述したファイルと*.cmoというオブジェクトファイルができるけど、単純に実行バイナリを作るのに必要なのは*.cmoだけっぽい。実際、ソースをコンパイルしたあとにできる*.cmiファイルを消して、そのうえでリンクしても問題無かった。

BIN=hello
SRC=hello.ml
CAMLC=ocamlc
OBJ=$(SRC:.cmo=.ml)

$(BIN): $(OBJ)
 $(CAMLC) -o $(BIN) $(OBJ)

.ml.cmo:
 $(CAMLC) -c $<

clean:
 rm -f *.cm[iox] *~ .*~ #*#
 rm -f $(BIN)

出力

$ make
ocamlc -o hello hello.ml
$ file hello.cmi
hello.cmi: OCaml interface file (.cmi) (Version 011)
$ file hello.cmo
hello.cmo: OCaml object file (.cmo) (Version 007)
$ ./hello
konnichiwa aardvark

末尾のセミコロン二つがちょっと気持ち悪い。