プログラミング言語SML#解説 4.0.0版
19

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の評価結果の値がポイン タであれば,そのポインタが指す値を取り出す. exp1 := exp2は, exp1の評価結果の値がポインタであれば,そのポインタが指す値を, exp2の評価結果の値で書き換える.

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