2018/07/04

OCamlの特徴とHelloWorld!

特徴

OCamlは、型推論機構とパターンマッチング機構、ガベージコレクタ、多相ヴァリアント型を備えた関数型言語です。もともとCamlという言語だったものにクラスや継承などといったオブジェクト指向の機能が追加され、ObjectiveCamlという名前になり、略称だった名称が正式名称になり、OCamlとなったそうです。公式ドキュメントで少しヤンチャな印象を受ける面白い言語です。
REPL(Read Evaluate Print Loop)があり、Lisp、Python、Ruby、Haskellなどのように対話的にプログラムを試すことができます。REPLは、以下のようなコマンドで開きます。すると、#の記号が現れます。これがOCamlのプロンプトになります。
$ ocaml

# "Hello, world!!";;
- : string = "Hello, world!!"
# #quit;;
上記のように、式の最後は;;で終わらなくてはなりません。REPLを抜ける時は、#quit;;と打ちます。また上記のコードで注目していただきたいのが、stringです。これは型推論機構が推論した結果です。

ただし、このREPLだけの状態だと、扱いにくさを感じることがあると思います。そのためutopを使ったり、rlwrapをインストールして、$ rlwrap ocamlとして起動することで、より快適に使うことができるようになります。

OCamlの開発環境づくり

インストール

OCamlのインストールは、公式ドキュメントで推奨されているようにOPAMを使います。OPAMを使うことで、バージョンの切り替えを行うことができます。他の方法も、公式ドキュメントには記載されていますので、ご参考にしてください。

OPAMはまず$ opam initをしてから使用を開始します。

OPAMをインストールした後、merlin duneなども入れると良いと思います。 merlinはコード補完、duneはプロジェクト管理を行うものです。


$ opam install merlin dune

エディタ

皆様それぞれお好みのエディタがあるので、使いやすいものをご使用ください。

個人的には、Emacsが良いのではないかと思っています。

merlinがインストールされていれば、


$ opam user-setup install

とすることで、VimとEmacsの設定ファイルにmerlinのための設定を追記してくれます。そして各エディタの設定はmerlinのリポジトリのwikiに詳しく書かれています。

私はEmacsを使いますので、Emacsの方でもcompany tuaregをインストールして使います。これらの設定に関しても上記のwikiに書かれています。

tuaregをインストールするとEmacs上で、片方のウィンドウはファイルを開きコードを書き、もう片方ではOCamlのREPLを開くことができ、コードを確認・実行しながら書いていくことができます。

まずEmacsにてOCamlファイルを開きます。そしてM-x run-ocamlとすると、OCamlのREPLが立ち上がります。そして、ファイルのコードにカーソルを合わせてC-c C-eとすると、REPLのほうにそのコードが転写?されて、実行することができます。

Hello, world!!

REPL上ではなく、hello.mlファイルを作成してやってみます。
(* File hello.ml *)

print_string "Hello, world!\n"
OCamlでは、コメントは(* comment *)のようにして書きます。また、コメントはネスト可能であり、以下のように書くことも可能です。
(* comment
   (* comment *)
*)
複数行の場合は、
(* comment
 * comment
 *)
ではhello.mlをコンパイルしてみます。
$ ocamlc -o hello hello.ml
または
$ ocamlopt -o hello hello.ml
ocamlcはバイトコードに、ocamloptはネイティブコードにコンパイルします。実行速度はネイティブコードのほうが速いです。
$ ./hello
Hello, world!
また、REPLで呼び出したい場合は、以下のようにします。
$ ocaml

# #use "hello.ml";;
Hello, world!
- : unit = ()
#

unit型というのは、()という値だけを持つ型で、C言語のvoidに似ていますが、voidは値を持っていませんので少し違います。OCamlでは、特に型を指定する必要がありませんが、OCamlでは、以下のような型が存在します。

  • int
  • float
  • string
  • char
  • bool
  • unit

ただし、int型は符号あり整数なので、基本型ではないですがnativeint型という符号なし整数型もあります。またint型は32bitCPUなら31bit、64bitCPUなら63bitの整数になっています。1bit少ない理由は、ガベージコレクションのために内部で使っているからだそうです。

使用感

個人的にはLispとRustの中間ぐらいに位置する言語という存在で、情報が少ないものの、勉強のしがいのある言語ではないかと感じています。vimやemacsではmerlinを導入すれば、より快適に使うことができます。詳しくはmerlinのリポジトリのwikiに各エディタごとの設定方法がかかれていますので、そちらを参考にされると良いかと思います。

インストールに関してはOPAMを使うと、様々なバージョンを使うことができるので、OPAM経由でインストールすると良いようです。また、プロジェクト管理にはduneを使うと良いようです。

OCamlのマニュアルはPDFファイルを公式ドキュメントからダウンロードできます。すべて英語で結構な量ですが、持っていると便利です。