9. トップレベルシステム(ocaml

9.1. オプション
9.2. トップレベル指示子
9.3. トップレベルとモジュールシステム
9.4. よくあるエラー
9.5. カスタムトップレベルの作成: ocamlmktop
9.6. オプション

本章では Objective Caml のトップレベルシステムについて解説します。 トップレベルシステムを使うと Objective Caml システムを REPL (read-eval-print loop)を介して対話的に利用することができます。 このモードでは、システムは入力から Caml のフレーズを繰り返し読み込み、型を検査してコンパイルして評価し、戻り値があればそれに対して推論された型と結果の値を表示します。 システムはフレーズを読み込む前にプロンプトとして # を表示します。

トップレベルに複数行にわたる入力を与えることもできます。 入力は ;; (ダブルセミコロン)で終端します。 トップレベルへの入力は以下の構文で表されるフレーズをひとつ以上並べたものです。

toplevel-input ::= { toplevel-phrase } ;;
toplevel-phrase ::= definition
| expr
| # ident directive-argument
directive-argument ::= ϵ
| string-literal
| integer-literal
| value-path

フレーズには、翻訳単位の実装やモジュール式 struct ... end と同じく定義を書くことができます。 定義では値、型、例外、モジュール、モジュール型の名前を束縛することができます。 トップレベルシステムは束縛を行なうと、定義された名前の型と、値が存在すればそれを表示します。

open 指示子( 6.11 節「モジュール式 」 参照) や値式( 6.7 節「式 」 参照)を書くこともできます。 式は単純にそのまま評価され、束縛は行なわれず、その式の値が表示されます。

最後に、フレーズには # で始まるトップレベル指示子もあります。 この指示子でトップレベルの動作を制御します。 指示子については 9.2 節「トップレベル指示子」 で説明します。

[注記]Unix

トップレベルシステムは以下のように ocaml コマンドで起動します。

ocaml options objects                # interactive mode
ocaml options objects scriptfile     # script mode
    

options については後で説明します。 objects.cmo ないしは .cma で終わるファイル名です。 これらのファイルは options が設定されると直ちにインタプリタに読み込まれます。 scriptfile は拡張子が .cmo でも .cma でもない任意のファイル名です。

コマンドラインで scriptfile が与えられなかった場合には、トップレベルシステムは対話モードに入ります。 この場合には、フレーズを標準入力から読み込み、結果を標準出力に、エラーを標準エラーに出力します。 標準入力からファイル終端を受け取ると ocaml コマンドは終了します( 9.2 節「トップレベル指示子」#quit 指示子も参照してください)。

カレントディレクトリに .ocamlinit ファイルが存在する場合には、起動時に(フレーズを読み込む前に)、 9.2 節「トップレベル指示子」#use 指示子を使った場合と同様に、そのファイルの内容を Objective Caml のフレーズの並びとして読み込んで評価します。 このフレーズの評価結果は表示されません。 カレントディレクトリに .ocamlinit ファイルが存在せず、ユーザーのホームディレクトリ(環境変数 HOME の値)に .ocamlinit が存在する場合には、こちらを読み込んで実行します。

トップレベルシステムには行編集機能はありませんが、 leditocaml2rlwrap といった行エディタと組み合わせて使うのは簡単です(Caml Hump を参照してください) また別の選択肢として、 Gnu Emacs から ocaml を起動すれば、 Emacs の編集機能をすべて使うことができます(inf-caml ライブラリの run-caml コマンド)。

現在のフレーズの構文解析中、コンパイル中、評価中のいかなる時にでも ctrl+C で(より正確に言えば、 ocaml コマンドに INTR シグナルを送信することで)トップレベルを中断することができます。 トップレベルシステムは直ちに # プロンプトに戻ります。

コマンドラインで ocamlscriptfile 引数が与えられていた場合には、トップレベルシステムはスクリプトモードになります。 この場合には、 #use 指示子( 9.2 節「トップレベル指示子」)を使った場合と同様に、そのファイルの内容を Objective Caml のフレーズの並びとして読み込んで評価します。 ファイルの終端に達すると ocaml コマンドは直ちに終了し、標準入力からはフレーズを読み込みません。 Sys.argv には、コマンドラインから Objective Caml への引数を除き、スクリプトファイルの名前が Sys.argv.(0) に入るようにしたものが格納されます。

スクリプトモードでは、スクリプトファイルの最初の行が #! で始まる場合、その行を無視します。 したがって、スクリプトファイル自体を実行可能にし、最初の行を #!/usr/local/bin/ocaml として、スクリプトファイルの実行時に自動的にトップレベルシステムを呼び出すことも可能です。 ただし、 Objective Caml のインストールでは、ほとんどの場合 ocaml コマンド自体が #! スクリプトであり、また、 Unix カーネルは通常入れ子になった #! スクリプトを扱いません。 これについてはスクリプトの最初の行を次のようにすれば解決できます。

#!/usr/local/bin/ocamlrun /usr/local/bin/ocaml
[注記]Windows

上記の Unix 版と同様に動作するテキストベースの ocaml.exe に加え、 GUI 版のトップレベルである ocaml.exe を使うこともできます。 Windows のファイルマネージャやプログラムマネージャから起動してください。 テキストウィンドウが表示され、その中でコマンドを入力、編集し、トップレベルからの応答を見ることができます。