Ch.6 SML#の拡張機能:Cとの直接連携

§ 6.2. C関数の型

SML#から利用可能なC関数は,SML#の型システムで表現 できる型を持つ関数です. _import宣言にこれらC関数の名前と型を記述することによって 使用可能になります. _import宣言に書く型は,使用するC関数の型をそれに対応する SML#の記法で書いたものです. SML#コンパイラは,C関数の型に従い引数をセットし関数を呼び 出コードを生成すると同時に,val宣言で与えられた変数の値にC関数をセッ トします. この変数は,C関数の型に対応してSML#が与える型として使用で きます. SML#で表現可能なC言語の型のサマリを表 6.1に示します.

Cの型 SML#での記法 対応するSML#の型 制限(備考)
int int int
char char char
unsigined int word word
float float float
double real real
const char * string string exportのみ
constτ * τ vector τ vector 要素が相互運用型の時
τ * τ array τ array 要素が相互運用型の時
構造体へのポインタ レコード レコード 要素が相互運用型の時
τ0 id(τ1,,τn) (τ1,,τn) -> τ0 τ1 * * τn -> τ0 要素が相互運用型の時
void* unit ptr _ (Cのポインタ型)

Figure 6.1. CとSML#の型の対応

この表の通り,ほぼCの関数の型が,そのままSML#の関数の型と なります. 例えば,標準のライブラリ関数などは,以下のように宣言するだけで SML#の関数として使用することができます.

# val sin = _import "sin" : real -> real
val sin = _ : real -> real
# sin (Math.pi / 6.0); val it = 0.5 : real

intrealなどの原子型ばかりでなく,次節で説明すると おり,複数引数関数や構造体を受け取る関数なども利用できます.