命令型言語の機能
1. 参照型
参照型(reference type)は,値への参照を表すデータ型で,命令型言語のポインタ型に相当します.
例えば,整数の 5 という値を参照する参照型の値は ref 5 のように書き,その型は int ref のように書きます.
- val n = ref 5;
val n = ref 5 : int ref
- val c = ref #"a";
val c = ref #"a" : char ref
参照型は等値型であり,関数 = は参照の等価を評価します.
- val m = ref 5;
val m = ref 5 : int ref
- val n = ref 5;
val n = ref 5 : int ref
- m = n;
val it = false : bool
この例で式 m = n の値が false なのは,変数 m, n がそれぞれ異なる場所にある値 5 を参照しているためです.
参照型の値に適用できる関数には,次のようなものがあります.
| 関数 | 型 | 説明 |
|---|---|---|
| ! r | 'a ref -> 'a | r の参照する値を返す |
| r := x | 'a ref * 'a -> unit | r の参照する値を x に書き換える |
これらの関数を利用すると,命令型言語の機能である,変数への値の再代入と同様のことを実現できます.次に例を示します.
- val m = ref 2;
val m = ref 2 : int ref
- !m;
val it = 2 : int
- m := 3;
val it = () : unit
- !m;
val it = 3 : int
2. 評価順序
参照型の演算などといった副作用を伴うプログラムでは,式の評価順序が意味を持ちます. Standard ML では,複数の式が並列に並んでいるとき,これらの式は原則として左から順に評価されます. 以下に示すレコード式はその一例です.
- { 1 = (print "1\n"),
2 = (print "2\n"),
3 = (print "3\n") };
1
2
3
val it = ((),(),()) : unit * unit * unit
複数の式の評価順序を制御するには,以下のような式を利用することもできます.
| 式 | 説明 |
|---|---|
(式1 ; … ; 式n) |
式1, …, 式n を順に評価し,式n の値を全体の値とする. |
式1 before 式2 |
式1, 式2 (式2 は |
while 式1 do 式2 |
式1 ( |
例えば while 式は以下のように使います.
- while (!m < 8)
do (print ((Int.toString (!m)) ^ "\n") ; m := !m + 1) ;
4
5
6
7
val it = () : unit
3. 例外処理
TODO
トップレベルで宣言されている標準の例外には,次のようなものがあります.
| 例外 | 説明 |
|---|---|
| Bind | 束縛の失敗 |
| Chr | chr 関数の失敗 |
| Div | ゼロ除算 |
| Domain | 定義域のエラー |
| Empty | 空リストによるエラー |
| Fail of string | 汎用の例外 |
| Match | マッチングの失敗 |
| Option | valOf 関数の失敗 |
| Overflow | オーバーフロー |
| Size | サイズ超過 |
| Span | span 関数の失敗 |
| Subscript | 範囲外の添字 |