Ch.11 SML#分割コンパイルシステム

§ 11.4. 型の隠蔽

前節の例から理解されるとおり,インターフェイスファイルの基本的考え 方は,以下のとおりです.

  1. datatypeexceptionなどのコンパイル時に定義される資源 (静的資源)は,将来そのインターフェイスファイルで定義される実体そのものを 記述する.

  2. 関数や変数などの実行時の値を表すものは,その型のみを宣言する.

これら情報が,コンパイラがこのインターフェイスファイルを使う別のソー スコードをコンパイルする上で必要かつ十分な情報です. しかし,この原則だけでば,Standard MLのモジュールシステムが提供 する型情報の隠蔽の機能を使うことができません. 例えば,前節のインターフェイスファイルqueue.smiでは,'a queueの実装が,Q of 'a list * 'a listと定義され公開されていま すが,この実装の詳細は隠蔽したい場合が多いと思われます.

この問題の解決のために,インタフェイスファイルに

type tyvars tyid (= typeRep)    (* 括弧はそのまま記述する *)
eqtype tyvars tyid (= typeRep)    (* 括弧はそのまま記述する *)

の形の隠蔽された型の宣言を許しています. この宣言は,型tyidが定義されその実装の表現はtypeRepであるが, その内容はこのインターフェイスの利用者からは隠されることを表しています. シグネチャ同様,type宣言は,同一性判定を許さない型,eqtypeは同一性判定が可能な型を表します. 実装情報typeRepには,その型のメモリ上での表現を代表する名前で 指定します. 実装情報typeRepに指定できる主な名前は以下の通りです.

  • wordintword8charrealreal32な どの原子型の実装表現.

  • contag. 引数を持たないコンストラクタのみから成るデータ型の実装表現.

  • boxed. ヒープ上のオブジェクトへのポインタによる実装表現. レコード型,配列型,関数型,contagに該当しない形の datatypeで宣言された型などが該当します.

例えば,queue.smidatatype 'a queue宣言のかわりに

type 'a queue (= boxed)

と書くことができます. 実装情報は型とは異なる概念であり,異なる名前空間を持つことに 注意してください.

さらに,シグネチャの場合同様,インターフェイスファイルは,そのイン ターフェイスを実装するソースが定義する変数をすべて網羅している必要はありま せん. インターフェイスに宣言されたもののみが,そのインターフェイスを_require宣言を通じて利用するユーザに見えるようになります.