命令型言語の機能

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 -> 'ar の参照する値を返す
r := x'a ref * 'a -> unitr の参照する値を 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 (式2unit 型) を順に評価し,式1 を全体の値とする.

while 式1 do 式2

1 (bool 型) の値が true の間,式1 に続いて 式2 を評価する.全体の値は () とする.

例えば while 式は以下のように使います.

- while (!m < 8)
  do (print ((Int.toString (!m)) ^ "\n") ; m := !m + 1) ;
4
5
6
7
val it = () : unit

3. 例外処理

TODO

トップレベルで宣言されている標準の例外には,次のようなものがあります.

例外説明
Bind束縛の失敗
Chrchr 関数の失敗
Divゼロ除算
Domain定義域のエラー
Empty空リストによるエラー
Fail of string汎用の例外
Matchマッチングの失敗
OptionvalOf 関数の失敗
Overflowオーバーフロー
Sizeサイズ超過
Spanspan 関数の失敗
Subscript範囲外の添字