分割コンパイルモードのプログラムは,ソースファイル とそのインターフェイスを記述したインターフェイスファ イルの集合である. ソースファイルの内容sourceは以下の通りである.
source | ::= | interfaceFileSpec sourceProgram |
interfaceFileSpec | ::= | _interface "filePath" |
sourceProgram | ::= | |
decl sourceProgram | ||
topdecl sourceProgram |
ソースファイルに対応するインタフェイスファイルの指定 interfaceFileSpec指定しない場合でかつ,ソースファイル.smlと同一ディレクトリにサフィクスが.smiの同一の名の ファイル.smiがあれば,そのファイルが暗黙に インタフェイスファイルとして指定される. filePathは相対パスであり, OSによらず,ディレクトリの区切り文字には/(スラッシュ)を用いる.
インターフェイスファイルの内容interfaceは,ソースファ イルが必要とする他のコンパイル単位の参照宣言の列requireListと, ソースファイルが他のコンパイル単位に提供する仕様の列provideListを記述する.
interface | ::= | requireList provideList |
requireList | ::= | |
_require local interfaceName requireList init | ||
_require local sigFilePath requireList init | ||
interfaceName | ::= | smiFilePath |
librarySmiFilePath | ||
provideList | ::= | |
provide provideList | ||
provide | ::= | provideInfix |
provideVal | ||
provideType | ||
provideDatatype | ||
provideException | ||
provideStr | ||
provideFun |
requireListは,ソースファイルが参照する他の ソースファイルのインターフェイスファイル(smiファイル)パス, ライブラリのsmiファイル名, またはシグネチャファイルのパス名を指定する. _requireに続くlocalは, その_requireで指定されたインターフェースファイルが ソースファイルからのみ参照され, provideListからは参照されないことを表す. このlocalを適切に加えることによって,不要なインターフェース ファイルの読み込みを抑止し,コンパイル時間を短縮することができる. initは,指定されたインターフェースファイルに対応する プログラムが,_requireが書かれたプログラムよりも先に必ず評価 されることを表す注釈である. provideListは,ソースファイルが,他のコンパイル単位 に提供する宣言の仕様である.
smiFilePath,sigFilePath,および librarySmiFilePathは,_requireが書かれたファイルから 他のファイルへの相対パスである. OSによらず,ディレクトリの区切り文字には/(スラッシュ)を 用いる. パスが.(ピリオド)から始まっておらずかつファイルが存在 しない場合は,コマンドラインで与えられたロードパスからファイルを検索する.
SML#が提供する代表的なライブラリのインターフェイスファイ ルには以下のものがある.
ライブラリsmiファイル名 内容 basis.smi Standard ML基本ライブラリ ml-yacc-lib.smi yacc, lexツール smlformat-lib.smi SMLFormatフォーマッタ生成ツール smlnj-lib.smi Standard ML of New Jerseyライブラリ ffi.smi Cとの連携サポートライブラリ thread.smi マルチスレッドサポートライブラリ reify.smi 動的型付けサポートライブラリ smlunit-lib.smi 単体テストツール
宣言に対応するプロバイドは以下の通りである.
核言語の宣言とインタフェイスの対応
宣言 (decl) 対応するプロバイド (provide) infixDecl provideInfix valDecl provideVal valRecDecl provideVal funDecl provideVal datatypeDecl provideData typeDecl provideType exceptionDecl provideException localDecl
モジュール言語の宣言とインタフェイスの対応
宣言 (topdecl) 対応するプロバイド (provide) strDecl provideStr sigDecl functorDecl provideFun localTopdecl
シグネチャファイルは,インタフェイスに直接 _require sigFilePath 宣言で参照する.
以下に簡単なプログラム例を示す.
例1(基本ライブラリの使用)
ファイル | コード |
---|---|
hello.sml | val _ = print "こんにちは,SML#へようこそ\n" |
hello.smi | _require "basis.smi" |
コンパイルと実行例
$ smlsharp hello.sml
$ ./a.out
こんにちは,SML#へようこそ
$
例2(分割コンパイル)
ファイル | コード |
---|---|
hello.sml | val _ = puts "こんにちは,SML#へようこそ" |
hello.smi | _require "puts.smi" |
puts.sml | val puts = _import "puts" : string -> int |
puts.smi | val puts : string -> int |
コンパイルと実行例
$ smlsharp -c hello.sml
$ smlsharp -c puts.sml
$ smlsharp -o hello hello.smi
$ ./hello
こんにちは,SML#へようこそ
$