OCamlに手を出す

週末に引越し、ということで本なんかを送ってしまいました。

読む本が無いので、前から手を出そうと思っていたOCamlに手を出してみました。

導入

とりあえずDebianにaptで放り込む。

 1libcamomile-ocaml-data                          install
 2libcamomile-ocaml-dev                           install
 3libequeue-ocaml                                 install
 4libequeue-ocaml-dev                             install
 5libextlib-ocaml-dev                             install
 6libfileutils-ocaml-dev                          install
 7libocamlnet-ocaml                               install
 8libocamlnet-ocaml-dev                           install
 9libpcre-ocaml                                   install
10libpcre-ocaml-dev                               install
11ocaml                                           install
12ocaml-base                                      install
13ocaml-base-nox                                  install
14ocaml-findlib                                   install
15ocaml-interp                                    install
16ocaml-nox                                       install

こんな感じ。どうやらfindlibというライブラリが重要らしい。パッケージ管理系のライブラリなんですけど。

んでテンプレ的なのはこんな感じにしてみた。

1#use "topfind"
2#camlp4o
3#require "camlp4.extend"
4#require "extlib"
5#require "camomile"
6
7open ExtLib

練習

超特急: 一時間でわかるML超入門 を見てから、 Objective Caml 入門 を読みながら、書いてみた。

普通に書きやすい。練習問題は・・・。なんていうか、SICP。普通に関数型言語として使うところまでやってみた。

日本語

EUCとUTFは大丈夫っぽい。ここらへんはCamomileというモジュールを使うらしい。とりあえず

1module Encoding = CamomileLibrary.Default.Camomile.CharEncoding
2module Enc = Encoding.Make (CamomileLibrary.UTF8)
3let unicode s = Enc.decode (Encoding.of_name "jauto") s;;
4let decode t n = Enc.encode (Encoding.of_name n) t;;

などとPythonみたいな関数を定義してみた。 jauto でエンコーディングは自動的に判別してくれるらしい。コードをEUCで書いてUTF-8のコンソールに出力してみる。うんうん、ちゃんと日本語いけてる。ただ、UTF-8で書いたファイルで unicode "ああああ" ってしたら当然 "ああああ" のままだと思うんだけど、ダメだった。なんでなんだろう。詳しい人いたら教えて欲しいです。

今までの感想

結構いい。モジュールシステムなんかはきっちりしてんなー、と思いました。オブジェクトシステムなんかが特徴だと思うんだけど、まだ触ってないんですよねえ。てゆーか詳しく解説しているところがすくないんで、どーしようかなあ。

あと、インタプリタの #require "camomile" みたいなのって、ネイティブコンパイラだとエラーになるんだけどこういうもんなんだろうか。つまりどっちか選びなさい、ってことでいいのかなあ・・・。ネイティブコンパイラでは無視してくれると一番ありがたいような気がするけど・・・

comments powered by Disqus