Think Stitch
PRINCIPIA  最近の更新


改名によるプロセスの再利用

改名を使うとプロセスを再利用することができます。 望む動作をするプロセスがあっても、使用されているイベントやチャネルが異なれば接続できません。 しかし改名を使えばこれを合わせることができます。 つまりインターフェイスを合わせることができるということです。

バッファの例

例として次のようなバッファを考えます。

(define-process P
  (? in (x) (! out (x) P)))

計算木は次の通りです。

これを再利用しようとしたとき、相手が出力チャネルとして例えば mid を要求していると接続できません。 そのような場合は out を mid に改名すれば、接続することができます。

(define-process R
  (rename `((,out . ,mid)) P))

計算木は次のようになります。 尚、チャネル mid から出力したあとの状態は R と同じです。 名前付けの関係で異なる状態に見えるだけです。 プロセス木を見れば、R と同じ状態であること(改名の中が P であること)がわかります。

P を2回再利用して、連結したプロセスを作ってみます。 前後の out と in を、それぞれ mid に改名して接続できるようにします。

(define-process S
  (par (list mid)
    (rename `((,out . ,mid)) P)
    (rename `((,in . ,mid)) P)))

プロセス木上で、rename は独立したノードを持ちます。 メニューから rename-map をインスペクトしたりキャプチャしたりできます。

バッファの多段階連結

改名による再利用については以上ですが、話のついでに多段階の連結をしてみましょう。 間を接続するチャネルを3つ用意して、次のような連結をすることにします。

定義は次のようになります。 見た目はやや複雑ですが、後ろから順に連結して隠蔽しているだけです。 最後に残る見えるチャネルは、先頭の in と末尾の out です。

(define-process SYS
  (hpar (list mid)
    (rename `((,out . ,mid)) P)
    (hpar (list mid2)
      (rename `((,in . ,mid) (,out . ,mid2)) P)
      (hpar (list mid3)
        (rename `((,in . ,mid2) (,out . ,mid3)) P)
        (rename `((,in . ,mid3)) P)))))

容易に想像がつくと思いますが、これはキューと同じ働きをします。 このことを確かめてみます。 次のようにキューのモデルを作成します。 これはユーザガイドにあるスタックとほとんど同じです。 違いは、入力されたデータをリストの先頭に加えるか末尾に加えるかという点だけです。

計算木は次の通りです。

比較をすると、まったく同じプロセスであることがわかります。

2013/08/09
© 2013,2014,2015 PRINCIPIA Limited