パッケージ

MINERVAのパッケージ機構は、大規模なプログラムの構築の際に 開発者が余分な努力をすることなく、以下を達成できる メカニズムを提供しています。

動機

プログラムの大規模化、複数のプログラマによる共同開発、メンテナンスの必要性 及びソフトウェアエンジニアリング手法により、 プログラムを管理可能な独立性の高いモジュールに分けることが望まれています。

MINERVAは、複数の異なるネームスペースの提供および知的なロードスキーマにより これを可能にしています。MINERVAでは、動的にロード可能なモジュールを 実装し、かつコンパイラによる厳格で静的なチェックを行なっています。

これにより、小さく、迅速にロードされ、かつ、頑健性の高いプログラムの作成が 可能になりました。

原則

MINERVAコンパイラminervacは、各*.minのMINERVAソースファイルに対して、 モジュールインタフェース仕様を持つ *.mpk MINERVAパッケージファイルと、 *.mbc MINERVAバイナリコードファイルの二つのファイルを生成します。

プログラムは、指令packageにより他のパッケージにアクセス することができます。

そのプログラムで定義されていず、packageの指令によりアクセス 可能ではない述語が明確に呼び出された場合、 コンパイラは、エラーメッセージを出します。

デフォルトでは、プログラムはすべての述語をエクスポートします。

アンダスコア('_')によって始まる述語は、*.mpkファイルには エクスポートされません。このため、他のパッケージからは アクセスできません。

同じ名前/アリティを有する述語がいくつかのパッケージから エクスポートされると、最初にロードされたパッケージの述語のみが呼び出され、 他のパッケージの述語は隠されます。

パッケージは、ディレクトリの中で探索され、それから minervaの-spパラメータで与えられたシーケンスに応じて 探索されます。

複数回関連付けられたパッケージも、一度しかロードされません。

別れているパッケージのネームスペースは別々になっています。

"aaa"のパッケージはaaa/1、aaa1/1, aaa2/1をエクスポートしますが、 _aaa3/3はエクスポートしません。

% file: aaa.min

aaa(C) :- aaa1(A), aaa2(B), '_aaa3'(A,B,C).

aaa1(1). aaa2(2).

'_aaa3'(A,B,C) :- C is A + B.

"bbb"のパッケージは、"aaa"からエクスポートされたすべての述語と bbb/1をエクスポートしますが、 _aaa3/3はエクスポートしません。

bbb/1の定義は、"bbb"の_aaa3/3を使用しています。"aaa"の_aaa3/3は "bbb"にはアクセス可能ではありません。

% file: bbb.min
:- package(aaa).

bbb(C) :- aaa1(A), aaa2(B), '_aaa3'(A,B,C).

'_aaa3'(_,_,ccc).

"ccc"は、"bbb"と"bbb"から再帰的に"aaa"をアクセスすることが できます。"ccc"は、aaa/1をエクスポートします。 もし、"ccc"がまずロードされる場合、?- ccc(X)の結果はX=1です。 これは、"aaa"のaaa/1の定義は、"ccc"にはアクセス可能ですが、 "ccc"のaaa/1の定義によって、隠されてしまうためです。

%  file:  ccc.min
:- package(bbb).

ccc(C) :- aaa(C).

aaa(1).

プログラミングの際のお勧め

プログラミングの場合には、以下をお勧めします。


戻る 続く..