MinCamlはMLのサブセットです。優先順位や括弧などの細かいことを別にすると、以下のような構文をもっています。
e ::= | 式 |
c | 定数 |
op(e1, ..., en) | プリミティブ演算 |
if e1 then e2 else e3 | 条件分岐 |
let x = e1 in e2 | 変数定義 |
x | 変数の読み出し |
let rec x y1 ... yn = e1 in e2 | 再帰関数定義 |
e e1 ... en | 関数呼び出し |
(e1, ..., en) | 組の作成 |
let (x1, ..., xn) = e1 in e2 | 組の読み出し |
Array.create e1 e2 | 配列の作成 |
e1.(e2) | 配列の読み出し |
e1.(e2) <- e3 | 配列への書き込み |
これをMLのデータ型Syntax.tとして表したモジュールがsyntax.mlです。ただし、letやlet recのように、新しい変数が定義される式では、その型も(上の構文にはありませんが)含まれています。この型を表すType.tはtype.mlで定義されています。
T ::= | 型 |
π | プリミティブ型 |
T1 → ... → Tn → T | 関数型 |
T1 × ... × Tn | 組の型 |
T array | 配列型 |
α | 型変数 |
最後の「型変数」は、型推論のところで使用します。
なおMinCamlコンパイラでは、いわゆるカリー化関数の部分適用を自動ではサポートしていません。つまり、関数呼び出しではすべての引数を与えなければいけません。部分適用をしたいときは、たとえばlet
rec f_123 x = f 123 x in f_123のように自分で関数定義をする必要があります(Scheme言語を知っている人は、それと同じだと思ってください)。
また、命令型プログラミングに必要な参照(reference)もありませんが、これは要素が一個しかないような配列で代用できます。具体的には、ref
eはArray.create
1 e、!eはe.(0)、e1
:= e2はe1.(0) <- e2とすればOKです。