PefungeでGを使わずに複数のローカル変数を扱う一般的な手法

を思いついたわけだ。

フレームはチャンネルにメッセージとして保存する。チャンネルごとに1フレーム、1メッセージとする。メッセージ(=フレーム=チャネル)のフォーマットは

Γ' = (Γ, v1, v2, v3, …, vn, n+2)

ここで、Γはひとつ上のフレームを保存したチャンネルであり、v はローカル変数の値、最後にフレームのサイズを記録する。

フレームの操作中以外の実行中は常に最新のフレームがスタックのトップにあるものとする。

フレームから値を読み出すには、「?」で受信すればよい。受信するとチャンネルが空になるので、再送信しないといけないが、フレームのサイズが最後についてるので、簡単に

  >:!
:?|
  >残りの処理

とするだけで、チャンネルをリフレッシュできる。

これを使うと、フレーム内の任意の変数 v に対して(奥底に埋もれていてもよい)

[…, Γ]

から

[…, Γ, v]

とすることができる。


新しいフレームを作って、値「1 2 3」を記録する

  >123!
&\|
  >$残りの処理

フレームから複数の値v1, v2, v3, …を取り出してスタックを

[…, Γ, v1, v2, v3, …, vn, Γ]

の状態にするには、n = 0 のときは「:」を実行するだけで、n-1までできたとして

[…, Γ, v1, v2,v3, …, vn-1, Γ]

の状態から、上に書いた変数の読み出しを実行して

[…, Γ, v1, v2, v3, …, vn-1, Γ, vn]

として、「\」を実行すれば完成。

同様の操作を使えば、フレームΓの奥底に沈んでいる変数 v1, v2, … を任意に選び出して

Γ' = Γ, v1, v2, …

な新しいフレームを作成できる。

遅延評価されるフレームなんて簡単に作れるね。