命令型言語の機能

参照型

参照型 (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

評価順序

参照型の演算などといった副作用を伴うプログラムでは,式の評価順序が意味を持ちます。 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

例外処理

TODO

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

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