Execute ポート

Executeポートとは、一種の特別なポートです。グラフの実行制御に使用します。Executeポートとその接続の大部分は、Canvas中の他の通常のポートと接続と同じようにみえます。が、振る舞い方は若干異なります。いかに述べていきましょう。

Executeポートとは、ポート型が組み込み型である Execute型 であるポートです。『Execute型』とは、空の型でありデータを運ぶものではありません。しかし、Fabric Engineのコアはこの『Execute型』のポートを見つけると、Canvasグラフをどのように実行するかの制御にこのポートを使用します。

暗黙の Executeポート

全てのインスタンスノードは自動的に『exec』と言う名の『Execute型の』ポートを持ちます。これを 暗黙の Executeポート(implicit execute port) と呼びます。暗黙のexecuteポートは、通常のポートとは別に表示され、ノードヘッダからアクセスできます。

../_images/exec-1.png

一旦接続がなされると、接続線がノードヘッダから,あるいはノードヘッダへと伸びます。

../_images/exec-2.png

暗黙のexecuteポートは、そのノードが実行される前に、ノードによって自動的に『引かれ(pulled)』ます。これにより Canvasプログラマが、そのノードへと接続されている他のノードが、そのノード実行前に確実に実行されることを保証できます。

明示的な Executeポート

暗黙のexecuteポートに加え、明示的なexecuteポートをノードに加える事もできます。単純に Execute 型のポートを追加しましょう。

../_images/exec-3.png

forループを実装したCanvas関数の上の例では、 body ポートが Execute 型を持ちます。

暗黙のexecuteポートが実行されるようにするには、上の例のように dfgExecute(...) コンストラクタの中でポート名を単純にラップします。

注釈

dfgExecute(...) コンストラクタを作るかどうかは任意です。暗黙のexecuteポートの名前を単純に、式として挿入すると、それが実行されます。この挙動の目的は、特定の多態ノード(例えば Fabric.Core.Control.If )において、ノードのポートが execute型であったりなかったりしても、操作がどちらも同様にうまくいくようにするためです。

Executeポートへの接続、Expertsポートからの接続

『Execute型』どうしのポートの接続にくわえ、 Execute 以外の型ポートから Execute 型のポートへと接続を張ることができます。

../_images/exec-4.png

このような接続は、該当ポートを単純に引いてくるものの、結果は破棄します。

Executeポートへの複数の接続

通常のポートとは違い、一つの Executeポートに対し、複数の接続をすることが可能です:

../_images/exec-5.png

複数の接続を貼る場合、Canvasが『引いて』くる接続ポートの順序は保証されません。これは最終的には、複数の枝の並列実行を可能にするためです。直列実行を保証したい場合には、 Execute.Merge プリセットを使用します。

注釈

現状の Canvasインタフェースでは、接続の順序を確認することができません。したがって、ノードの配置レイアウトを手動で接続順序と合わせることで、グラフを読むことになる人物にとって明らかになるようにしておくことをおすすめいたします。将来の Fabric のバージョンで修正予定です。

Executeポートの複数の実行

通常のポートと違い、暗黙のexecuteポートが複数回『引かれる』場合、実際に複数回分、評価がまわります。これによりユーザ独自の ループ型 を executeポートを使用し作成することができます。

さらに、executeポートが引かれる際はいつでも、そのexecuteの上流の全てのポート(execute, 非execute)が再評価されます。対照的に、通常のポートが引かれる場合は、評価済でない場合のみ、上流ポートの評価がなされます。

明示的な Cache ノードを使うことで、(execute と 非execute) ポートが一度のみ引かれるようにすることが可能です。Cacheノードを、一度のみ評価を行いたいノードの手前に単純に配置します。

Fabric 付属のサンプル ForLoop.canvas ( $FABRIC_DIR/Samples/Canvas/ExecutePorts/ForLoop.canvas )で以上のことを実践しています。この用例では、executeポートを使いノード一式をループのボディとして実行し、Canvas変数をループ回数の追跡に用いています。

注釈

This example is meant to serve primarily as an example of how execute ports work; For a more natural way of looping over groups of nodes please refer to the blocks section of the Canvas Programming Guide