Sunday, 25 September 2011

Continuation Workshop 2011

最初は2001だったんじゃないかな〜 論文なしで「お祭りみたいな感じにしよう」というのが亀山さんの意図らしいです。
自分の発表は朝10時だったけど、直前で枚数を見ると37枚。ガリガリ削って26枚。でも、15分だったので、かなりOver。まぁ、いつものことか。でも、いつものことだが、かなり異質な発表だったかも。継続とは名乗っているけどね。
http://www.ie.u-ryukyu.ac.jp/~kono/papers/kono/2011/cbc/
s5 の flower theme です。最後の写真は「台風か?」とか言われました。
継続入門も面白かったです。
http://pllab.is.ocha.ac.jp/~asai/cw2011tutorial/main-j.pdf
継続ってのは逐次計算の「残りの計算」のこと。
(3 * 4) + x + 2
とかで、まず 3*4 を計算すると、
(・) + x + 2
が残り。ってことは、これをλで表して、
λy (y + x + 2 )
ってのが継続ということになる。なるほど。で、これを取って来るのがschemeの call/cc です。
これだと、全部取れちゃうので、ここからマークというか、括弧を入れれます。これが reset 。reset があるものを限定継続 delimited continuation と言うらしい。CPS 変換して、それを元に戻す時に発見されたんだろうな〜
reset の中は関数なので、本当は fun とか使うらしいが省略。(こういう省略は LISPでは special form とか言う)
(reset ((3 * 4) + x + 2 )) + 1
(reset ((・) + x + 2 )) + 1
で、reset に対する継続が λy (y + x + 2 ) になると。
shift は継続を受け取る関数を引数に取って、代わりの継続を返す
(reset ((shift (λk 100)) + x + 2 )) + 1
とかすると、101 が返ります。k には、 λy (y + x + 2 ) が入る。+ x + 2 は無視。ひどい。
(reset ((shift (λk k 1)) + x + 2 )) + 1
だと、
λy (y + x + 2 ) 1
(1 + x + 2 )
だから、
(1 + x + 2 ) + 1
x + 4
(reset ((shift (λk k k 1)) + x + 2 )) + 1
とか二回使うこともできて、
((1 + x + 2 ) + x + 2) + 1
2*x + 6
ふーん。スタック全部取って来るみたいなところがあって、しっかもそれをコピーしないといけない。
(reset ((shift (λk "string")) + x + 2 ))
みたいなことをすると、reset が数字じゃなくて文字列を返す。なので、reset の型を予測することは難しいらしい。
shift の返す型を answer type というのですが、ここに k を返すと k の型は恐ろしい場合があるので、怖いらしいです。1 page ぐらいのエラーメッセージが返るとこともあるらしい。ひーん。浅井さんとかは「いや、お茶の水の学生でも使える」と言ってましたが。
reset は try で、shift が throw ってことは、catch がないね。match で受ければ良いか。k の複製を禁止してもらうと実装しやすいんだけど。実装屋さんには厳しい。まぁ、やれって言われればやりますが。
Monad もそうだけど、sfhit/reset も使うのはプログラマでしょ。手加減して欲しいなぁ。
(・) は、なんか面白い。

No comments: