この章では Objective Caml で実装されているがリファレンスマニュアルで説明されていない文法拡張や便利な機能を説明します。
7.1 |
Streams and stream parsers |
|
ストリームとストリームパーザはもう Objective Caml に組み込まれていませんが、CamlP4 文法拡張を通して利用可能です。詳細は CamlP4 のリファレンスマニュアルを見てください。ストリームとストリームパーザを使うプログラムをコンパイルする場合は、ocamlc や ocamlopt に -pp camlp4o オプションを指定してください。対話式システムで使う場合は、ocaml を起動した後 #load "camlp4o.cma";;
としてください。
Objective Caml ではパターンに
' c ' .. ' d '
という (2 つの文字を .. でつないでいる) 形を、
' c ' | ' c1 ' | ' c2 ' | ...
| ' cn ' | ' d '
というパターンの省略形として指定することが出来ます。c1, c2, ..., cn は ASCII 文字列で c と d の間に出てくる文字です。たとえば、パターン '0'..'9' はすべての数字にマッチします。
Objective Caml ではデバッグのために assert を入れることが出来ます。assert expr という式は expr が true の時 () を返し、false の時例外 Assert_failure を発生します。Assert_failure には引数としてソースファイル名と expr の位置が指定されています。Assertion チェックを行わない場合は、コンパイラオプションに -noassert を指定してください。
特別な場合として、assert false は型多相な raise (Assert_failure ...) に還元されます (-noassert オプションを指定しても Assertion チェックが行われます) 。
7.4 |
Deferred computations |
|
lazy expr という式は、expr の評価をカプセル化した Lazy.t 型の値 v を返します。引数の expr はプログラムのこの時点では評価されていません。Lazy.force に v を適用することで初めて評価され、expr の実際の値が得られます。次に Lazy.force に v を適用しても評価は行われません。詳細については、標準ライブラリの Lazy モジュールを見てください (Module Lazy) 。
let module module-name = module-expr in expr という式はローカルモジュールを表します。expr の中でだけ、module-name という識別子がモジュール module-expr に割り当てられます。expr を評価した値を返します。たとえば以下のように使います。
let remove_duplicates comparison_fun string_list =
let module StringSet =
Set.Make(struct type t = string
let compare = comparison_fun end) in
StringSet.elements
(List.fold_right StringSet.add string_list StringSet.empty)
7.6 |
Grouping in integer and floating-point literals |
|
整数と浮動小数のリテラルでは、文字 _ (アンダースコア) で数字を区切ることが出来ます。1_000_000 、0x45_FF 、1_234.567_89 のように表記できます。このアンダースコア文字はリテラル中で単純に無視されます。