命令型言語の機能
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 | 範囲外の添字 |