| << Prev | - Up - | Next >> |
パッケージとしても知られているモジュールは、手続きと値のコレクションで1、特定の関連する機能を提供するために一緒に構築されます。典型的なモジュールは、モジュールの外側からは見えないいくつものプライベート手続きとモジュールの外側に提供するいくつものインターフェース手続きを持ちます。Oz にはモジュール指定のための構文サポートがあります。この概念が使われたものはファンクタ(functor)と呼ばれます。ファンクタはモジュールのコンポーネントを指定する式です。Mozart システムはモジュールマネージャの助けを借りてファンクタをモジュールに変換します。
モジュールがどんなものなのかを見て、モジュールを指定する対応するファンクタを見ましょう。一般的に、モジュールはたくさんのローカルで定義されたエンティティ(entity 実体)です、例えば手続き、オブジェクト、レコードインターフェースを通じてアクセス出来る物がそうです。append, sort, 含まれるメンバのテストのためにいくつものインターフェース手続きを持つ List と呼ばれるモジュールを構築したいと想定しましょう。これは以下の様に見えるでしょう。
declare List in
local
proc {Append ... } ... end
proc {MergeSort ...} ... end
proc {Sort ... } ... {MergeSort ...} ... end
proc {Member ...} ... end
in
List = 'export'(append: Append
sort: Sort
member: Member
... )
end
List の外側からの Append 手続きへのアクセスは、フィールド append を使って record List: List.append から行われます。上の例では手続き MergeSort はモジュールのプライベートな物である事に注目して下さい。Mozart の基本的なライブラリモジュールのほとんどは上の構造をなぞっています。上のモジュールは以下で見るファンクタから作る事が出来ます:
functor
export
append:Append
sort:Sort
member:Member
...
define
proc {Append ... } ... end
proc {MergeSort ...} ... end
proc {Sort ... } ... {MergeSort ...} ... end
proc {Member ...} ... end
endこのファンクタが例えば '/home/xxx/list.ozf' に保存されると想定すると、モジュールは以下の様に生成する事が出来ます:
declare [List]= {Module.link ['/home/xxx/list.ozf']} Module.link/2 はモジュール Module で定義された関数でファンクタのリストを取ってリンクし、対応するモジュールのリストを返します。
ファンクタは import 宣言を持つかもしれません。あなたがシステムモジュールをインポートしたいのなら、そのファンクタを記述するだけでよいです。別のユーザ定義のモジュールのインポートの手法は、ファンクタが保存されているファイルのURLの記述を必要とします。
以下のファンクタについて考えましょう。
functor
import
Browser
FO at 'file:///home/seif/FileOperations.ozf'
define
{Browser.browse {FO.countLines '/etc/passwd'}}
end
import 宣言はシステムモジュール Browser をインポートし、手続き Browser.browse を使います。それはまたファイル '/home/seif/FileOperations.ozf' に保存されたファンクタによって指定されるモジュール FO をインポートし、引数で与えられたファイルの行数をカウントする手続き FO.countLines を呼び出します。このファンクタはその効果のために定義され、それゆえにインターフェースをエクスポートしません。このファンクタがリンクされると、define ... end の間の文が実行されます。
注意:ファンクタを定義しているファイル 'x.oz' があるとすると、あなたは対応するファンクタ 'x.ozf' をシェルで次のコマンドを打ち込んで作れます:
ozc -c x.ozf
| << Prev | - Up - | Next >> |