Event.wrap_abort を π計算 で表現してみる その2
ひとつ前のエントリ でテキトーに作った abort 演算子を使って、OCamlプログラムのコード例を追ってみる。
open Event let start_server () = let in_ch = new_channel () in let rec loop () = let (x, ret_ch, nack_ch) = sync (receive in_ch) in loop (select [send ret_ch (x * 2); receive nack_ch]) in ignore (Thread.create loop ()); in_ch let calc3 in_ch x = guard (fun () -> let ret_ch,nack_ch = new_channel (), new_channel () in sync (send in_ch (x, ret_ch, nack_ch)); wrap_abort (receive ret_ch) (fun () -> ignore (Thread.create (fun () -> sync (send nack_ch ())) ())))
こいつを上の abort演算子を追加したπ計算で書いてみる。
まずサーバー
クライアント
[tex:Client\stackrel{\tiny def}{=}(\mbox{\bf \nu} ret,nack)(\overline{in}\langle 123,ret,nack\rangle.*1]
ここではクライアントの継続,は他のイベント.
紙の上で計算
最初の1ステップ
普通の通信. この後,次の2通りに分岐する:
1. で通信した場合
とする.
無事 に 123 * 2 = 246 が代入される.
2. が環境と通信した場合
なる , が存在して,
その後 で通信して
となってくれる. …多分.