<< 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 >> |