7 Modules and Interfaces

パッケージとしても知られているモジュールは、手続きと値のコレクションで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 


1. Classes, objects, etc.

Seif Haridi and Nils Franz�n
Version 1.4.0 (20080704)