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, …
な新しいフレームを作成できる。
遅延評価されるフレームなんて簡単に作れるね。