Chapter 9 トップレベル対話環境 (ocaml)このページは最後に更新されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。 last mod. 2008-10-01 (水) 11:35:58
The Objective Caml system release 3.10 この章では 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 のファイルマネージャかプログラムマネージャから起動してください。 9.1 Optionsocaml コマンドに認識されるコマンドラインオプションは以下の通りです。
Unix:以下の環境変数も参照されます。
9.2 Toplevel directivesトップレベルの動作をコントロールする識別子一覧です。ファイルをメモリにロードしたり、プログラムの実行をトレースしたりします。 注意: 識別子はすべて # (シャープ) で始まります。この識別子の前の # は自分で入力してください。対話式ループが表示するプロンプトではありません。例えば #quit;; と打つとトップレベルループは終了しますが、quit;; と打つと ``unbound value quit'' とエラーが出ます。
9.3 The toplevel and the module systemコンパイルユニットの中で定義されている識別子は、分割コンパイルと同じメカニズムで、トップレベルフレーズから参照できます。限定された名前 (Modulename.localname) を使うか、open コンストラクトを使った後、限定されていない名前を使うことです (セクション 6.3 を見てください) 。 しかし、他のコンパイルユニットを参照する前に、そのユニットの実装がメモリになければなりません。トップレベルシステムは起動時に標準ライブラリモジュールをすべてメモリにのせます。ユーザモジュールの実装は上記の #load 指示語を使ってロードできます。実装がメモリにないユニットを参照しようとすると ``Reference to undefined global `...' '' とエラーになります。 open mod としても、トップレベルは mod のコンパイル済みインターフェイス (.cmi) にアクセスするだけで、mod の実装はロードされず、かつ mod がロードされていなくても何のエラーも出ないことに注意してください。``reference to undefined global mod'' というエラーは mod を参照している値やモジュールの定義を実行しようとしたときだけ発生します。 9.4 Common errorsこのセクションではよく見るエラーメッセージについて解説します。
9.5 Building custom toplevel systems: ocamlmktopocamlmktop コマンドは、起動時にロードするべきユーザコードを内部に保持している Objective Caml トップレベルを作成します。 ocamlmktop コマンドは .cmo や .cma ファイルを引数に取り、Objective Caml トップレベルの実装であるオブジェクトファイルとリンクします。普通の使い方は以下のようになります。 ocamlmktop -o mytoplevel foo.cmo bar.cmo gee.cmo これで Objective Caml のトップレベルシステムと 3 つの .cmo ファイルのコードを持つバイトコードファイル mytoplevel が生成されます。トップレベルは直接起動できます。 ./mytoplevel これで通常のトップレベルループに入りますが、1 つだけ異なるのは foo.cmo 、bar.cmo 、gee.cmo のコードが、通常は以下のようにしてロードするところを、起動した時点ですでにメモリにロードされているということです。 #load "foo.cmo";; #load "bar.cmo";; #load "gee.cmo";; ただし Foo 、Bar 、Gee モジュールは open されていません。 open Foo;; なので望むなら上記のように open する必要はあります。 9.6 OptionsThe following command-line options are recognized by ocamlmktop.
|