部分継続
またMatz日記さんから。すみませんいつも本当に。
継続は継続でも「部分」継続とはこれいかに。
http://www.shiro.dreamhost.com/scheme/wiliki/wiliki.cgi?Scheme%3a%e4%bd%bf%e3%81%84%e3%81%9f%e3%81%84%e4%ba%ba%e3%81%ae%e3%81%9f%e3%82%81%e3%81%ae%e7%b6%99%e7%b6%9a%e5%85%a5%e9%96%80
この「部分継続」のところ。
reset/pcとcall/pcがポイントか。
;; reset/pcとcall/pcの使用2 (define k #f) ;; 継続保存用 (+ 1 2 (reset/pc (+ 3 4 (call/pc (lambda (cont) (set! k cont) (cont 5)))))) (k 1) => ((lambda (a) (+ 3 4 a)) 1) => 8 (k 2) => ((lambda (a) (+ 3 4 a)) 2) => 9 (k 5) => ((lambda (a) (+ 3 4 a)) 5) => 12
※原文例がちょっと違ってた感じなので勝手に解釈して修正。
あ、
どうやらcall/pcはreset/pcが捕まえている継続を捕らえるらしいぞ。
たしかに継続をぶった切ってる。「部分」継続とはそういうことらしい。
・reset/pcの継続を
・call/pcの内側で
・生成しちゃってる
なぁ。
:
:
※違ってたので訂正。
・reset/pcとcall/pcの継続は同じ!げげ!
・だけどcall/pcはreset/pcでラベリングされた継続までの「間の継続」を生成!げげ!
・reset/pcの"reset"とは、ラベリングされたところの本来あった継続を、「強引に」「闇のグローバル継続」つまり「計算結果を表示して次の式を評価する」に差し替える処理だ!
・げげげ〜!
・・・・・
ううう。これどうやってScheme-Kernelで書くんだううう。
それはそうと、部分継続をファーストクラスにして永続化させて外側で見えるようにして何かハッピーなことがあるんかな。
それはcall/ccや多値並みにハッピーかどうかと一緒で、意味論的には面白いし多値なみに継続は進化してるけど、それが実用的に利用されるかどうかはやっぱりなんというか。
call/ccというプリミティブ自体が実用的に利用されているのを見たことが正直言ってないなぁ。
「継続渡しスタイル」という「手法」は実用的だと思うけど・・・
call/cc call-by-values value reset/pc call/pc
という「プリミティブ自体」が「実用的に何かを解決してくれる」とは思えないなぁ。
だって可読性がちょっと・・・
まだ単純なGOTOの方がプログラムとしてはわかりやすいしねぇ。
あ、
継続でウェブアプリを作れば、いいかも。
あ、
それがKahuaか。
もいっかいプログラム読んでみようかな。
Kahuaでは、セッションを維持した次のウェブページ=継続だったから感動したんだよなぁ。
わかりやすい(と思うやつは終わってるかなぁ)。
"reset/pc"でぐぐぐっとすると、ああああKahuaがひっかかった。
https://www.kahua.org/cgi-bin/kahua.fcgi/kahua-web/show/doc/Modules/kahua.partcont
shiroさんはつきぬけている。
ああ、pcって"partial continuation"って部分継続の略ですね。
reset-with-partial-continuation
call-with-partial-continuation
ってことか。
相変わらず長い。
略すとわからない。
継続(というかScheme)はいつもそうだなぁ。
だいすきなんだけどなぁScheme。