プログラフ:タートル幾何学入門

ジム・サルモンズとティムリン・バビツキー著
JFSコンサルティング
MacTech Quarterly
1989年春号 – 52ページ
ノバスコシア州ハリファックスの Gunakara Sun Systems Limited は、オブジェクト指向、データフロー、ビジュアル プログラミングという 3 つの明確に異なる強力なコンピュータ サイエンス手法を組み合わせた新しいプログラミング言語と開発環境をリリースしました。
これらはどれも単体では圧倒的ではありませんが、これらを組み合わせることで、Prographはプログラミング環境と新しい言語を提供し、プログラムの考え方や記述方法を根本から変えるでしょう。私たちは、これをMacintosh向けに初めて商用製品として提供できたことを幸運に思います。
この記事では、Prograph 言語を紹介し、次に Prograph グラフィックス アプリケーションにタートル グラフィックスを追加するケース スタディの例で興味をそそります。
Prographのルーツ: ビジュアルOOPSとデータフロー
Prographは、階層的なクラス構造と属性およびメソッドの継承をサポートするオブジェクト指向プログラミングシステムです。しかし、Prographは、OOPSクラスのメソッド仕様にデータフローパラダイムを組み込むことで、OOPS環境として新たな境地を切り開きます。
Prographの構文指向グラフィックエディタは、テキストベース言語の設計レベルの抽象化ではなく、プログラムのコードそのものとなるデータフロー図の描画を容易にします。MainstayのVIP™やその他のCASE製品は概念的に従来の手続き型言語に結びついていますが、Prographはビジュアル言語です。Prographの様々な形状のアイコン/ノードとエッジコネクタは、それぞれ構文的な意味を持っています。
さらに、Prographダイアグラムは、明示的に指定されない限り、本質的に並行であり、データ駆動型で2次元です。特定の操作を実行するために必要なデータが利用可能であれば、操作は実行可能です。Prographプログラムをステップモードで実行すると、パチンコ台をボールが落ちるように、データが流れる様子を観察できます。
プログラムの基本
Prograph を紹介するために、言語をプログラミング環境から切り離し、トップダウンの視点を提供します。
Gunakaraは、ビジュアルプログラミング言語の開発において、多くのプログラミング言語に見られる英数字入力バイアスを克服することに成功しました。Prographのデータフローモデルは、非常に効率的なプログラムを実現します。例えば、従来の変数とその宣言や代入といった作業は不要です。
Prographグラフィカルエディタを使用すると、クラスとそのメソッド図を素早く作成できます。クラスウィンドウの空き領域をクリックすると新しいクラスアイコンが作成され、属性ウィンドウをクリックすると属性が追加され、メソッドウィンドウをクリックすると操作が追加されます。
Prographには構文に基づいたグラフィカルエディタが搭載されており、不正なダイアグラムを作成することはできません。また、Macのあらゆる機能も備えています。ROM呼び出し操作の名前を入力すると(または「情報」メニューからアクセスできるブラウザ風のダイアログから操作を選択して転送すると)、正しい数の入力端子と出力ルートを示す操作アイコンが表示されます。
クラス
ほとんどのOOPS言語と同様に、Prographはクラスとインスタンスの両方の属性とメソッドをサポートし、単一のクラス階層もサポートしています。クラスアイコンをOptionキーを押しながらクリックすると、ラバーバンドコネクタが表示され、別のクラスアイコンに接続して継承階層を定義できます。
図1のクラスウィンドウには、3つのクラスアイコンが表示されています。各クラスアイコンの左側には埋め込みクラス属性アイコン、右側には埋め込みクラスメソッドアイコンがあります。左側をクリックするとクラス属性ウィンドウが開き、右側をクリックするとメソッドウィンドウが開きます。
Prographクラスウィンドウには、開いているファイルのクラス階層がグラフィカルに表示されます。サブクラスは、親クラスと祖父母クラスの属性とメソッドを継承します。
図1では、CatクラスとElephantクラスは親クラスAnimalの汎用属性とメソッドを継承しています。属性名、体重、足指の下向き矢印は、これらの属性が継承されていることを示しています。サブクラスは、継承された属性に加えて独自の属性を持つことができます。図1のAnimal階層は、猫の毛の長さと象の胴体の長さを記録したいことを示しています。これらの属性はそれぞれサブクラス固有の属性です。
属性は継承されますが、各属性のデフォルト値は異なる場合があります。例えば、動物の体重属性はデフォルトで30ポンドに設定されていますが、猫はデフォルトで5ポンド、象は約2000ポンドと想定されています。
デフォルト値が割り当てられていない属性は、開始時にNULLに設定されます。クラス型のオブジェクトが作成される際、継承されたクラス属性構造体とそれに関連付けられたデフォルト値で初期化されます。後続の計算では、これらの値を読み出したり変更したりできます。属性へのアクセスと更新は、メソッド内で実行される主要な処理の一つです。
Prographはクラス属性とオブジェクト属性を明確に区別していますが、クラスメソッドとオブジェクトメソッドの区別は軽視されています。クラスメソッドとオブジェクトメソッドは、各クラスの「メソッド」ウィンドウにまとめて表示されます。
方法
ユーザー定義のPrographメソッドは、メソッドアイコンで識別されます。メソッドアイコンをダブルクリックすると、選択したメソッドの操作をグラフィカルに表示するCaseウィンドウが開きます。Caseは、Prographメソッドのケース構造を指します。
メソッドは1つ、あるいは任意の数のケースを持つことができます。単一ケースメソッドの場合、データが流入し、定義された操作が実行され、データ(オプション)が流出します。複数ケースメソッドの場合、様々な実行条件を考慮して複数のデータフロー図を記述できます。ユニフィケーションとブール演算の成否に基づいて、適切なケースが選択されて実行されます。
ここで、シングルケースメソッドに焦点を当ててみましょう。図2は、一方が他方を呼び出す2つのシンプルなPrographメソッドを示しています。メソッド「ask user」はユーザーから2つの数値を要求し、メソッド「divide&double」に渡します。呼び出されたメソッドは、最初の入力を2番目の入力で割り、その結果を2倍にしてから、結果を「ask user」に返します。メソッド「ask user」は、シンプルなダイアログウィンドウに結果を表示して実行を終了します。(このアクティビティは簡単に単一のメソッドに簡略化できますが、この例は、1つのユーザー定義メソッドが別のユーザー定義メソッドを呼び出す方法を示すために使用します。)
メソッドダイアグラム内の各ノードには、ターミナルと呼ばれる「入力ノブ」とルートと呼ばれる「出力ノブ」を任意の数だけ配置できます。PrographエディターはPrographに付属する様々な種類のノードをすべて認識しているため、これらのノードが作成される際に適切な数のルートとターミナルを提供します。システムが認識しないユーザー定義ノードについては、ルートとターミナルの数はユーザーが指定します。
メソッドダイアグラムでは、ルートとターミナルを結ぶ線に沿って情報が流れます。これらの線はセグメントと呼ばれます。2つ目の接続線であるシンクロは、ノードとノードを結び付けることで、本来は並行処理であるはずの環境において、明示的な順序付けを強制します。図2のシンクロは、ユーザーが除数の前に被除数を入力するように促すことを保証します。
ユーザー定義メソッドの各ケースには、ケースウィンドウの上部に入力バー、下部に出力バーがあります。メソッドの特定の呼び出しによって操作されるオブジェクトとデータは、呼び出し元メソッドからメソッドに入力される情報によって決まります。呼び出し元メソッドに返される情報は、呼び出されたメソッドの出力バーから「出力される」情報によって決まります。
ユーザー定義メソッドを呼び出すノードのターミナルと、呼び出されたメソッドの入力バーのルートとの間には、1対1の関係が存在します。あるいは、呼び出し元メソッドのノードのルートと、呼び出されたメソッドの出力バーのターミナルとの間にも、この関係が存在します。例えば、図2では、「ask user」ケースウィンドウの「divide&double」ノードのルートとターミナルを、「divide&double」ケースウィンドウの入力バーと出力バーと比較しています。
ノードを知る
様々な形状のノードアイコンとそのルート、ターミナル、相互接続線分、シンクロの意味を理解することで、メソッドによって実行される計算が明確になります。図3は、Prographにおけるすべてのノードタイプと、それらの解釈方法を示しています。
Prographプリミティブには、リスト、文字列、ビット操作、ユーザーインタラクション、数学、フォーム処理、高レベルファイルおよびリソース処理など、数百の便利な操作が含まれています。Prographパーシスタントは、セッション間でも保持されるグローバル変数に相当します。
Macintoshメソッドには、Toolbox ROMルーチンがすべて含まれています。Macintosh定数は、blackColorなどのニーモニック名を戻り値33などに関連付けます。Macintoshグローバルは、thePort、CaretTime、dkGray、screenBitsなど、頻繁にアクセスされるQuickdrawおよびLow Memoryグローバル変数へのアクセスを提供します。Access Macintosh Addressは、メモリ内のMacオブジェクトの検索に使用され、Get and Set Macintosh fieldsは、BitMapのbaseAddr、bounds、rowBytesフィールドなど、Mac構造体のフィールドにアクセスします。
システムが提供するPrographプリミティブとMacintoshメソッド(ツールボックスルーチン)は「ブラックボックス」であり、ソースダイアグラムレベルで開くことはできません。それぞれに規定の動作と、必須およびオプションのターミナルとルートがあります。これらのノードのいずれかをダブルクリックすると、ノードの入力、出力、および実行される動作について、「Inside Macintosh」風の説明を含むヘルプダイアログが表示されます。
ケースウィンドウ内のユーザー定義メソッドノードをダブルクリックすると、クリックしたノードのケースウィンドウが開きます。この相互参照方式により、Prographは、Prographプログラマーが開発したクラスとそのメソッドのコレクション間で、ハイパーテキストのようなスムーズなアクセスを提供します。
図4に示す2つのメソッドは、図3で紹介したノードタイプの一部を利用しています。メソッド「make & grow cat」は、新しいCatオブジェクトを作成し、そのオブジェクトは即座に1歳年を取り、8ポンド(約3.4kg)増加します。メソッド「open window」は、Macintoshツールボックスに直接アクセスし、Prographアプリケーション内に新しいウィンドウを作成します。
これら2つの例から、Prograph言語がまさに視覚的な構文であることがお分かりいただけるでしょう。Prographは、従来のテキスト言語の要素間に制御フロー接続を単に敷設するだけではありません。媒体となるのはメッセージです。
ルートとターミナルの注釈
Prographは、データフローメソッドの表現力をさらに高めるために、様々なルートアノテーションとターミナルアノテーションをサポートしています。ルートアノテーションとターミナルアノテーションは、Prographマルチプレックスの基盤です。マルチプレックスは、成功と失敗の制御アノテーションと組み合わせることで、Prographメソッドに「If…then…else」「For each…do」「While…repeat」といったテキスト構文で通常想定される実行フローを与えます。
図 5 に示すように、操作またはメソッド ノードのルートまたはターミナルにリスト、パーティション、またはループの注釈を追加すると、アイコンが「アイコンのスタック」の外観になり、この操作が複数回実行されることが示されます。
図5の「リスト」の例は、左端とルートにリスト「(…)」アノテーションが付けられた乗算演算セットを示しています。このアノテーションは、左の入力リストの各項目に乗算を適用し、それぞれの入力値の6倍の項目を含むリストを返します。
「Partition」の例では、入力端末にリスト注釈(分割対象のリスト)が表示されています。分割ノードには常に2つのルートがあります。左矢印は分割テストに合格した入力リスト項目を、右矢印はテストに不合格となったリスト項目を表します。
「Mixed」メソッドは、図5のリスト入力に対して反復加算を実行し、ループ注釈(対応する終端とルートのペアと矢印)を導入します。この注釈は、この演算の結果が出力され、操作を「一周」して戻ってくることを視覚的に示しています。中間反復結果は操作内部に保持され、最終結果6のみが出力されることに注意してください。
「Looping」の例では、終了処理に統合制御メカニズムを利用する2つのメソッドによる反復処理を導入しています。メソッド「Looping」は、実行時に呼び出される「factorial」メソッドをループ処理することで、4の階乗を計算します。「Looping」における「factorial」メソッドノードの左側のルートとターミナルは、「factorial」で実行される連続した乗算を累積します。右側のルートとターミナルは、「factorial」を呼び出す回数に応じて減少するインデックス関数を実行します。
図5は、「factorial 1:1」Caseウィンドウにおけるメソッド「factorial」の内部動作も示しています。入力バーの右ルートにある定数「0」には、「成功時に終了」という注釈が付いています。この注釈は、「入力ルートが0になった場合、反復処理を終了し、この反復処理で入力された値を出力端子に渡す」という意味です。つまり、「Looping」は、「factorial」メソッドノードの左ルートから出力される答え「24」で反復処理を終了します。
コントロールの必要性
上記で紹介した「成功時に終了」制御は、Prographのフロー制御メカニズムの一例です。図6は、2ケースの「繰り返し」方式における「失敗時に次のケース」制御を備えた繰り返し多重化を示しています。
「repeat」のケース1は「repeating dialog」メソッドを呼び出します。「repeating dialog」では、answerオペレーションが「何をしますか?」というプロンプトと「続行」および「キャンセル」ボタンを備えたシンプルなMacintoshダイアログボックスを表示します。ユーザーが「続行」をクリックする限り、「repeating dialog」は実行を完了し、制御を「repeat」に戻します。repeatマルチプレックスは再び「repeating dialog」を実行します。
ユーザーが「キャンセル」をクリックすると、「繰り返しダイアログ」内の「成功時に失敗」統合制御が満たされます。つまり、「キャンセル」ボタンが押された時点でメソッドは失敗します。成功時に失敗を示すアイコンは、中央にチェックマークが付いた八角形の停止標識のように見えます。
ユーザーがキャンセルボタンを押して「ダイアログの繰り返し」が失敗すると、「繰り返し」はマルチプレックスの呼び出しを中止し、次のケースに進みます。この例では、ケース2は「これでおしまいです!」というダイアログメッセージを表示するだけです。
マルチプレックスに制御アノテーションがない場合、Prographは「呼び出された操作は失敗しましたが、関連付けられた制御がありません」という説明メッセージでエラーを通知します。この失敗に対処するため、繰り返しマルチプレックスにアノテーションが付けられており、ここでは「失敗時の次のケース」制御(角丸四角形の中に「X」)が示されています。
合計で10種類の制御条件があり、そのうち9つには明示的なアイコン注釈があります。「成功時に続行」はすべての操作呼び出しで想定されるデフォルトの条件であるため、アイコン注釈はありません。存在しないウィンドウを閉じる呼び出しなど、それほど重要ではない状況では、「失敗時に続行」したい場合があります。残りの8つの制御条件は、以下の4つの状況それぞれについて、「失敗時」と「成功時」のバージョンです。
- 次のケースは、現在のケースの実行を停止し、次のケースの実行を開始します。
- 失敗し、現在のケースの実行を停止し、メソッドの呼び出しを失敗します。
- 現在のケースの実行を終了し、停止し、呼び出し元のマルチプレックスの実行を終了します。
- 終了し、現在のケースの実行を継続し、呼び出しマルチプレックスの実行を終了します。
ケース構造および多重化機能と組み合わせることで、この範囲の制御注釈により、Prograph プログラムの実行フローを制御する際に大きな柔軟性が得られます。
タートルグラフィックスからPrographへ
ここで、皆さんの理解を深めるために、Prograph Examples ディスクに収録され、図 7 に示すクラス階層を持つ Prograph 描画アプリケーションにタートル グラフィックスを追加します。タートル グラフィックスを実装するために追加した 2 つのクラスが強調表示されています。
クラス階層には4つの独立した「ツリー」があります。「application」クラスは環境の属性構造を提供し、アプリケーションが実行中かどうかを示すフラグと、メニューオブジェクトおよびウィンドウオブジェクトのリストを保持します。このクラスのメソッドには、ウィンドウの追加、削除、および検索に必要なすべてのメソッドが含まれています。他のメソッドはメインイベントループを実装し、「ケースワイズカスケード」を通じて、イベントの取得と処理に関する偶発的な事象を処理します。
このアプリケーションの個々のメニューは、親クラス「menu」のサブクラスとして実装されています。ウィンドウの一般的な機能は「window」クラスにカプセル化されており、グラフィックスウィンドウを操作するための特殊な属性とメソッドはサブクラス「graphicWin」に追加されています。残りのクラスツリー「graphic」は、Quickdrawグラフィックオブジェクトの作成と操作に必要な属性とメソッドを提供します。
永続的な「application」は、「application」クラスのオブジェクトを格納します。そのメニューリストには、各メニューサブクラスのオブジェクトが保持されます。永続的な「window-list」属性には、セッション間でウィンドウオブジェクトが格納されます。「program」メソッドは、永続的な「application」からメニューとウィンドウの情報を取得し、メニューを初期化し、アプリケーションを最後に実行したときに残っていたウィンドウを再作成します。次に、「program」メソッドはメインのイベントループメソッドを呼び出します。このメソッドで図形を選択し、Quickdrawベースのさまざまなグラフィックオブジェクトを描画および再描画できます。「File」メニューから「Quit」を選択すると、イベントループメソッドが終了します。「program」メソッドは、「close」メソッドを呼び出して「application」永続オブジェクトを保存し、その後、自身の実行を終了します。
この描画プログラムにタートル グラフィックスを組み込むには、新しいタイプのウィンドウ サブクラス「turtleWin」と新しいグラフィック サブクラス「turtle」が必要です。
タートルグラフィックスを既存のグラフィックスアプリケーションに組み込むために、「file」サブクラスに「New Turtle Window」メソッドを追加します。また、「Shape」メニューの項目として「Turtle」を追加し、「shape-list」属性に「turtle」を追加します。これにより、ユーザーがタートル項目を選択してグラフィックスウィンドウをクリックしたときに、アプリケーションはどのサブクラスのグラフィックスオブジェクトを作成するかを知ることができます。
タートルのサブクラス
「turtleWin」ウィンドウサブクラスを追加するのは簡単です。タートルウィンドウは、(0,0)座標がウィンドウの左上隅ではなく中央に移動していることを除けば、ほぼすべての点でグラフィックスウィンドウと似ています。これにより、ウィンドウのローカル座標が従来のタートルグラフィックス座標系と一致します。
クラスウィンドウの「graphicWin」アイコンをOptionキーを押しながらクリックし、ラバーバンドを下に引いてマウスボタンを放します。「turtleWin」と入力すると、親ウィンドウクラスの属性とメソッドを継承した新しいサブクラスが作成されます。新しいサブクラスを完成させるには、図示されていない3つの新しいメソッドが必要です。親グラフィックウィンドウの「open」メソッドと「grow」メソッドを隠して、「setHomeCoords」メソッドの呼び出しを追加します。この3つ目の新しいメソッドは、ポートを設定し、ウィンドウの境界矩形に基づいてオフセットを計算し、MacintoshメソッドSetOriginを呼び出します。
一方、「タートル」オブジェクトは、その独特な特性と動作を扱うために、かなりの数の新しいメソッドを必要とします。確かに、タートルはQuickdrawの用語ではペンですが…「スマート」なペンです。タートルはタートル手続き記法(Turtle Procedure Notation)を理解します。これは、ウィンドウ内で無限の幾何学的パターンを描くためにタートルがどのように動くかを記述する言語です。
元の描画プログラムのグラフィックオブジェクトには、色、形状、境界矩形を維持するための属性があります。タートルに必要なのはこれらとは異なります。新しい「タートル」サブクラスアイコンの左側をクリックすると、属性ウィンドウが開き、「グラフィック」親クラスから継承した属性の一覧が表示されます。これに「名前」、「位置」、「見出し」、「尾の幅」、「トレイルカラー」、そして最も重要な「プログラム」属性を追加します。これらの属性アイコンのいずれかをダブルクリックするとダイアログが開き、新しいタートルにいくつかの基本的な特性を与えるためのデフォルト値を入力できます。
グラフィックウィンドウまたはタートルウィンドウには、「contents」属性があり、現在ウィンドウ内にあるオブジェクトのリストが格納されます。ウィンドウが作成、サイズ変更、あるいは何らかの理由で表示されると、「update」メソッドが「contents」から各オブジェクトを取得し、そのアイテムに自身を「描画」するよう指示します。そのため、各タートルは「program」属性に元のプログラムのコピーを保持しています。ウィンドウの「contents」リストから取得されたタートルは、パターン生成プログラムを再生して自身を再描画します。
タートルメソッド
タートルオブジェクトの属性を指定したら、メソッドを追加してタートルに命を吹き込みます。設計の観点から、タートルオブジェクトには以下のものが必要です。
- アプリケーション環境全体の中で「生まれ」、自らを描くことができること。
- 古典的な個々のタートル表記コマンドを理解し、実行できるようになります。
- ネスト可能な「repeat」や「doPoly」構造を含む複雑なタートル プログラムを読み取り、それを構成するコマンドに解析して、タートルが規定のパターンを描画できるようにします。
タートルの行動の各領域は、「分割統治」戦略に基づいて個別に対処されます。まず、一時的なメソッド「main」を作成し、それをアプリケーション環境に「ハードワイヤード」します。
「main」メソッドは、タートルオブジェクトジェネレータから「newborn」をノードに渡し、開発中の基本コマンドメソッドを呼び出します。このようにして、タートル記法の「forward」「back」「left」「right」「home」「setHeading」「hideTurtle」「showTurtle」コマンドを実装するメソッドを構築します。
図8は、これらの基本的なタートル移動コマンドを代表しています。「forward」メソッドは、タートルオブジェクトと距離を入力として受け取ります。「turtle/forward」ウィンドウの背後にあるケースウィンドウには、前進移動を実行するために必要な3つのユーティリティメソッドが表示されます。これらの補助メソッドは、タートル表記法で使用されるベクトルベースの方向と距離パラメータから直交座標を計算します。これにより、Quickdrawペンコマンドでタートルの描画を実行できます。
図8以降の図では、メソッド名の前に「/」文字があることに気付くかもしれません。このスラッシュは、入力として受け取ったオブジェクトのクラス内の指定されたメソッドを呼び出すことを示しています。この例では、ほとんどの場合、「turtle」クラスのメソッドが呼び出されています。
タートル記法の解析
図 9 の「解析」メソッドと図 10 のその補助メソッドは、Prograph のデバッグ機能によって作業が容易になる「コーディングと調整」を数回繰り返すことで進化しました。
特に注意すべき点は次のとおりです。
- 「detach-l」プリミティブは、リストに含まれるオプションのルートの数に基づいてリストの先頭から項目を抽出します。右端のルートがリストの残りの部分になります。
- 「parse」のケース 2 と 3、および「move」の奇妙に見えるノードは、メソッド呼び出しを実行時に決定できるようにする注入です。たとえば、文字列「forward」が注入されたノードに入力として渡され、その文字列で指定されたメソッドが呼び出されます。
- 疑問に思ったら、メソッド全体に散りばめられた自由形式のコメントを読んでみてください…(これらのコメントは、Prographプログラムファイルの一部としてサポートされています。図に後から追加されたわけではありません…オンとオフを切り替えることで「ビューをクリア」できます。)
図10の「repeat」、「doPoly」、「doSide&Turn」メソッドは、タートルが比較的少ないコマンドでトレースできるパターンの複雑さを高めるために組み込まれています。Prographのタートルの構文を拡張するには、「parse」メソッドにケースを追加し、新しい動作を実行する補助メソッドを追加するだけです。
タートルポリッシュ
残っているのは、タートルを指定するためのユーザーインターフェースを提供することだけです。タートルのプログラムを含む様々な属性を指定するためのフィールドを備えたダイアログボックスは、Macのような新しいタートルを定義する方法です。
Prographにはリソースエディタ(Prographで記述されており、それ自体がPrographプログラミングの非常に有益なツールです)が付属しており、ダイアログフォームを定義してアプリケーションファイルのリソースフォークに保存できます。図11の下部に示すように、Turtle Makerフォームを作成し、サンプルグラフィックスアプリケーションファイルに保存します。
次に、「graphicWin」クラスの「miss」メソッドにケースを追加します。このメソッドは、グラフィックウィンドウでクリックが検出され、そのクリックがウィンドウ内の既存のグラフィックサブクラスオブジェクトの境界矩形内にない場合に実行されます。「miss」メソッドは、「Shape」メニューで最後に選択された項目のインスタンスを作成します。新しいケースでは、選択された図形項目がタートルの場合、タートルオブジェクトジェネレータが新しいタートルを作成し、アクティブウィンドウの「contents」リストに追加するように指定しています。その後、タートルの「miss」ケースは、図11の左上隅に示されている「initialize」メソッドを呼び出します。
メソッド「initialize」は「get turtle」を呼び出し、タートルの属性をリストにまとめ、Turtle Makerフォームのデフォルトエントリとして渡します。メソッド「creation form」はフォームへのアクセスとユーザー入力を処理します。フォームのセットアップ、処理、そして閉じる手順が正しい順序で実行されるように、synchrosを使用していることに注意してください。
最後に、ユーザーがフォームを閉じると、アプリケーションはウィンドウを更新します。前述のように、グラフィックウィンドウは「contents」属性リスト内の各グラフィッククラスオブジェクトに、それぞれの「draw」メソッドを実行するよう要求します。図11に示すように、タートルは「program」属性を取得し、タートルとそのプログラムを「parse」メソッドに送信することで、自身を描画します。
図12は、Prographタートルグラフィックスの動作例です。タートルウィンドウに表示される5つのパターンはそれぞれ独立したタートルです。タートルの中心にある20ピクセル四方の領域をダブルクリックすることで、それぞれのタートルを変更できます。このクリックにより、選択されたタートルの現在の属性をまとめて編集用のタートルメーカーフォームを表示するメソッドが実行されます。
結論
Prographのタートル拡張の開発はとても楽しかったです。今春後半にPrographコンパイラがリリースされれば、さらに興奮することでしょう。Prographコンパイラは、スタンドアロンアプリケーションの開発を可能にするだけでなく、Prographインタープリタ内から呼び出せるモジュールを生成します。これにより、強力なPrograph開発環境の柔軟性を維持しながら、タートルをウサギに変えることができるようになります。
Gunakara Sun Systems Prograph 製品は、OOPS 市場に登場した革新的なソフトウェア テクノロジーの 1 つです。
製品情報
プログラムは以下から入手可能です:
グナカラサンシステムズ株式会社
1127 Barrington Street, Suite 19
ハリファックス、ノバスコシア州 B3H 2P8
カナダ
TEL (902)-429-5642
FAX (902)-429-9983
著者について
Jim Salmons氏とTimlynn Babitsky氏は、OOPSおよび関連市場におけるビジネス開発とテクニカルコミュニケーションを専門とするJFS Consultingの社長と副社長です。彼らは最近、Digitalk社のSmalltalk/V Mac™のユーザーマニュアルを完成させ、現在はPrograph™のマニュアルを執筆中です。
