19.20 組み込み型とその演算
SML#の組み込み型の中で,例外型(exn)の操作は, 第19.14節で定義したhandle構文とraise 構文で行われる. ユニット型(unit)に対する特別な操作はない. それ以外の組み込み型の値の操作は,組み込み関数として提供され,関 数適用式を通じて使用される.
参照型(’a ref)と配列型(’a array)以外の値は, 自然な関数型言語の意味論に従う値であり,組み込み関数は 値を受け取り値を返す関数である.
参照型(’a ref)と配列型(’a array)は,メモリー領域の 破壊的な更新を許す.
ty refの値はty型の値へのポインターで あり,以下の組み込み関数で操作される.
ref : ty -> ty ref
! : ty ref -> ty
:= : ty ref * ty -> unit
infix 3 :=
ref expによって,expの評価結果の値を 指すポインタが生成される. ref expは,expの評価結果の値がポイン タであれば,そのポインタが指す値を取り出す. exp := expは, expの評価結果の値がポインタであれば,そのポインタが指す値を, expの評価結果の値で書き換える.
ty arrayの値はty型の値を要素の型とする 変更可能な配列型である.
ty arrayを含むその他の組み込み型を操作する組み込み関数は, 型ごとに第25節で定義する標準ライブラリとして以下の 名前のストラクチャにまとめられている. Generalストラクチャには,参照型の組み込み演算,組み込み型 を操作する際に発生するシステム定義の例外などが定義されている.
組み込み型 | ストラクチャ | シグネチャ |
int8 | Int8 | INTEGER |
int16 | Int16 | INTEGER |
int | Int, Int32 | INTEGER |
int64 | Int64 | INTEGER |
intInf | IntInf | INTINF |
word8 | Word8 | WORD |
word16 | Word16 | WORD |
word | Word, Word32 | WORD |
word64 | Word64 | WORD |
real32 | Real32 | REAL |
real | Real, Real64 | REAL |
char | Char | CHAR |
string | String | STRING |
array | Array | ARRAY |
vector | Vector | VECTOR |
ref, exn | General | GENERAL |
定義されている演算一覧は,以下のように対話型環境で対応するストラ クチャを再定義してみると,見ることができる.
# structure X = Int;
structure X =
struct
type int = Int32.int
val * = <builtin> : int * int -> int
val + = <builtin> : int * int -> int
val - = <builtin> : int * int -> int
val < = <builtin> : int * int -> bool
val <= = <builtin> : int * int -> bool
val > = <builtin> : int * int -> bool
val >= = <builtin> : int * int -> bool
val abs = <builtin> : int -> int
val compare = fn : int * int -> General.order
val div = <builtin> : int * int -> int
val fmt = fn : StringCvt.radix -> int -> string
val fromInt = fn : int -> int
val fromLarge = fn : intInf -> int
val fromString = fn : string -> int option
val max = fn : int * int -> int
val maxInt = SOME 2147483647 : int option
val min = fn : int * int -> int
val minInt = SOME 2147483648 : int option
val mod = <builtin> : int * int -> int
val precision = SOME 32 : int option
val quot = <builtin> : int * int -> int
val rem = <builtin> : int * int -> int
val sameSign = fn : int * int -> bool
val scan = fn
: [’a. StringCvt.radix
-> (’a -> (char * ’a) option) -> ’a -> (int * ’a) option]
val sign = fn : int -> int
val toInt = fn : int -> int
val toLarge = fn : int -> intInf
val toString = fn : int -> string
val~
= <builtin> : int -> int
end