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

9.1. Options
9.2. Toplevel directives
9.3. The toplevel and the module system
9.4. Common errors
9.5. Building custom toplevel systems: ocamlmktop
9.6. Options

この章では Objective Caml のトップレベルシステムについて解説します。トップレベルシステムとは Objective Caml システムを read-eval-print のループを通して対話的に利用できるシステムです。このモードでは、システムは入力から Caml のフレーズを読み、型チェックし、コンパイルし評価して、導出された型と結果の値 (あればですが) を表示します。システムではフレーズを読む前に # (シャープ) プロンプトを表示します。

トップレベルに複数行にまたがった入力を与えることも可能です。入力は ;; (2 つのセミコロン) で終わります。トップレベルの入力には以下の文法で複数のトップレベルフレーズを与えることができます。

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'''が与えられなかったら、トップレベルシステムは対話モードになります。対話モードでは入力は標準入力から読み込み、出力は標準出力に、エラーは標準エラー出力に書き出します。標準入力から End-of-file を受け取ったら ocaml は終了します (#quit を受け取っても終了します。セクション 9.2 を見てください) 。

起動時に (フレーズの読み込みを始める前に) 、カレントディレクトリに .ocamlinit があればそれを Objective Caml のフレーズ列として読み込み実行します (セクション 9.2 で解説されている #use 指示語で行うことと同じです) 。それぞれのフレーズは評価されるだけで出力は表示されません。カレントディレクトリに.ocamlinitがない場合は、 ユーザのホームディレクトリ(環境変数HOME)から読み込まれ、上記のように実行されます。

トップレベルシステムにはラインエディットはありませんが、leditやocaml2、rlwrapのような外部コマンドラインエディタ(the Caml Humpを参照)を使えば可能になります。また、Gnu Emacs 上で ocaml を使用すれば、Emacs のエディット能力をすべて利用できます (inf-caml内のrun-camlコマンド) 。

フレーズの構文解析中でも、コンパイル中でも、評価中でも ctrl-C を押せば (正確には ocaml のプロセスに INTRシグナル を送ることで) 中断することができます。トップレベルシステムはすぐに復帰して # プロンプトを表示します。

コマンドラインで ocaml に'''scriptfile'''が与えられた場合は、トップレベルシステムはスクリプトモードになります。ファイルから Objective Caml のフレーズ列を読み込み実行します (これもセクション 9.2 の #use 指示語と同じです) 。ocaml はファイル終端に至った時点で終了し、標準入力からコマンドを読み込むことはしません。Sys.argv には Objective Caml パラメータは渡されず、先頭の Sys.argv.(0) にはスクリプトファイル名が入ります。

スクリプトモードではスクリプトの先頭行に #! がある場合その行は無視します。つまりファイル先頭に #!/usr/local/bin/ocaml と書けば実行可能なスクリプトファイルを作ることが理論上可能です。そのスクリプトを実行すると自動的にトップレベルシステムを起動します。しかし、ocaml 自体は #! スクリプトで、Unix カーネルは普通入れ子になった #! は扱いません。最初の一行を以下のようにすることで、この問題を解決できます。

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

上記の Unix 版と同じように動作するテキストベースの ocaml.exe コマンドに加えて、ocamlwin.exe という名前のグラフィカルユーザインターフェイスを持つトップレベルが使用できます。Windows のファイルマネージャかプログラムマネージャから起動してください。