プログラミング言語SML#解説 4.0.0版
7 MLプログラミング入門

7.4 定数式と組込み関数

型付き言語であるMLでは,定数式はすべて決まった型を持ちます. MLでよく使われる組込み型には以下のものがあります.

内容
int (マシン語1ワードの大きさの)符号付き整数
real 倍精度浮動小数点
char 文字型
string 文字列型
word (マシン語1ワードの大きさの)符号無し整数
bool 真理値型

真理値型以外は,他のプログラミング言語と考え方は同じです. これらの組込み方の定数式と基本組込み演算を覚えましょう. 真理値型の扱いは次節で説明します.

7.4.1 int型

int型は整数型です. SML#では,C言語のlongと同一の2の補数表現で表され る1語長の符号付き整数です. int型定数には通常の十進数の記述以外に0xh形式の16進 数でも記述できます. h0から9の数字とa(Aでもよい) からf(Fでもよい)までのアルファベットの並びです. 負数の定数はチルダ記号~を付けて表します. SML#はint型の値を十進数で表示します.

# 10;
val it = 10 : int
# 0xA;
val it = 10 : int
# ~0xFF;
val it = ~255 : int

int型に対しては,通常の四則演算+, -, *, divが2項演算 子として定義されています.

# 10 + 0xA;
val it = 20 : int
# 0 - 0xA;
val it = ~10 : int
# 10 div 2;
val it = 5 : int
# 10 * 2;
val it = 20 : int

これらの組合せは,通常の算術演算の習慣に従い,*,div+, -より強く結合します. また,同一の演算子は左から順に計算されます.

# 1 + 2 * 3;
val it = 7 : int
# 4 - 3 - 2;
val it = ~1 : int

7.4.2 real型

realは浮動小数点データの型です. SML#では,C言語のdoubleに相当する64ビットの倍精 度浮動小数点です. real型の定数はs.dEs の形で表現します. ここでsは符号付き十進数,dは符号なし十進数で す. 整数部,小数部,指数部のいずれも省略できますが.小数部と指数部の 両方を省略するとreal型ではなくint型と解釈されます.

# 10.0;
val it = 10.0 : real
# 1E2;
val it = 100.0 : real
# 0.001;
val it = 0.001 : real
# ~1E~2;
val it = ~0.01 : real
# 10;
val it = 10 : int

real型に対してもint型同様に四則演算が定義されていま す. ただし,除算はdivではなく/です.

# 10.0 + 1E1;
val it = 20.0 : real
# 0.0 - 10.0;
val it = ~10.0 : real
# 10.0 / 2.0;
val it = 5.0 : real
# 10.0 * 2.0;
val it = 20.0 : real

7.4.3 char型

charは1文字を表すデータ型です. 文字cを表すchar型定数は#"c"と書きます. cには通常文字以外に以下の特殊文字のエスケープが書けます.

\a warning (ASCII 7)
\b backspace (ASCII 8)
\t horizontal tab(ASCII 9)
\n new line (ASCII 10)
\v vertical tab (ASCII 11)
\f home feed (ASCII 12)
\r carriage return(ASCII 13)
\^C control character C
\" character "
\\ character \
\ddd the character whose code is ddd in decimal

# #"a";
val it = #"a" : char
# #"\n";
val it = #"\n" : char

文字型に対して以下の組込み演算が定義されています.

val chr : int -> char
val ord : char -> int

chrは与えられた数字をASCIIコードとみなし,そのコードの文字 を返します. ordは文字型データのASCIIコードを返します.

# ord #"a";
val it = 97 : int
# chr (97 + 7);
val it = #"h" : char
# ord #"a" - ord #"A";
val it = 32 : int
# chr (ord #"H" + 32);
val it = #"h" : char

7.4.4 string 型

stringは文字列を表すデータ型です. string定数は""で囲んで文字列表します. この文字列の中に特殊文字を含める場合は,char型で定義され ているエスケープシーケンスを使います. stringデータには,標準出力にプリントするprintと 2つの文字列を連結する^が組込み関数として定義されています.

# "SML#" ^ "\n";
val it = "SML#\n" : string
# print it;
SML#
val it = () : unit

7.4.5 word 型

wordは符号なし整数型です. word型定数は0wdまたは0wxh の形で表現します. ここでdはそれぞれ十進数,hは16進の数字列です. SML#はword型定数を16進表現で表示します.

# 0w10;
val it = 0wxa : word
# 0wxA;
val it = 0wxa : word

word型データに対してもint型と同じ四則演算が定義され ています. さらにword型データに対しては,種々のビット演算が定義されて います.