defobjライブラリでサポートされる型定義の機能について、例を使って解説しましょう。基本的なSwarmライブラリの解説を通じ、実行する例題はすべてサンプルSwarmシミュレーションに属する単純なオブジェクト型を使っています。このオブジェクト型は、二次元グリッドの中を内部的に管理された方向に動き回るエージェントです。このエージェントはオリジナルのLogoシステムの"turtle"に似ています。ただし、その位置は離散整数値のX-Y座標に限られ、移動方向は常に東西南北という4方向のいずれかに制限されています。
以下に、このGridTurtleと呼ばれるオブジェクトを定義するライブラリの、ライブラリヘッダファイルをすべて紹介します。
/* Name: GridTurtle.h Description: object type for Swarm example programs Library: grid */ #import <defobj.h> @deftype GridTurtle <Create, Drop, CREATABLE> CREATING - (void) setXLocMax: (int)xLocMax; - (void) setYLocMax: (int)yLocMax; SETTING - (void) setXLoc: (int)xLoc; - (void) setYLoc: (int)yLoc; - (void) setXLoc: xLoc setYLoc: yLoc; - (void) setDirection: direction; USING - (int) getXLoc; - (int) getYLoc; - getDirection; - (void) move: (int)distance; - (void) turn: (int)angle; // pi/2 (90 deg.)単位で測定した角度 - (void) print; @end id <Symbol> North, East, South, West; #import "grid.xt" |
オブジェクト型は@deftype宣言によって定義されます(注意:objectbaseやrandomといった比較的新しいライブラリはこの特殊な@deftypeタグは使わず、独自のライブラリインターフェイス規定に基づいています。したがって、それらは普通の@protocol宣言だけを使いますが、その他のものはすべてこのドキュメントで説明する構造に従います)。この宣言の構文は、上述のGridTurtleの例でキーワードがすべて大文字(CREATABLE、CREATING、SETTING、USING)で記述されていることを除き、Objective Cの@protocol定義と全く同じです。これらのObjective C構文の変更は、すべて簡単なプリプロセッサマクロによるもので、言語コンパイラを拡張したものではありません。
makeファイルの特別なルールがこのライブラリのヘッダファイルを処理すると、GridTurtleという名前を持った外部オブジェクトidが自動的に発行されます。定義される型名は普通のオブジェクトで、このオブジェクトはdefobjライブラリが定義した特定のメッセージを受け取ることができます。そのメッセージについてはdefobjライブラリで詳しく説明しているので、ここではdeftype宣言の基本セクションについてのみ説明します。
deftype宣言はメッセージの相互継承について、Objective Cプロトコルの構文に従います。すなわち、<Create, Drop, ...>のようなブラケットで囲まれた名前のリストには、新しい型にもサポートされるべきメッセージを含んだ別に宣言された型名を与えます(ここで参照される型はインポートしたファイル<defobj.h>で定義しています)。プロトコルと同様に、型の多重継承がすべてサポートされます。引数や戻り値の型が一貫していさえすれば、同じメッセージを任意の経路で何回でも継承することができます。このときメッセージは、1回だけ継承や宣言をした場合と同様に、一切の影響を受けることはありません。
上記の継承された型リストに現れるCREATABLEタグは、単にその型をそのインスタンスの直接的な作成をサポートするものとしてマークするだけで、それ自身のメッセージはまったく定義しない特別な型です。このタグがなければ、ある型の役割は他の型による継承に対してメッセージを定義することだけとなります。一方、このタグを使えば、グローバルな型オブジェクトは、defobjで定義された標準メッセージを使ったオブジェクト作成をサポートする特有の実装を持つようになります。
宣言される型のメッセージは、上記のCREATING、SETTING、USINGといった特別な大文字タグにマークされたセクションに分けることができます(現在有効なタグは上記のものだけです)。これらのセクションは、そのオブジェクト型の特別に定義された"インターフェイス"に属するメッセージをそれぞれ定義します。そのメッセージはさらに、defobjメッセージがサポートするオブジェクトライフサイクルの異なる"フェーズ"に結合されることになります。この例で定義したインターフェイスとフェーズに関する詳しい説明は、defobjライブラリの利用ガイドを参照してください。