the Arc Challenge と継続の関係
Paul Graham の the Arc Challengeが、盛り上がってます。
スレッドで高ポイントをとっているのは PLT Scheme Web ServerとSeasideですね。
もともと、継続をWeb開発に生かすというのがあって、
- 境界を越える: 継続とWeb開発、そしてJavaプログラミング
- ocaml-nagoya 関数型言語によるWeb開発
- http://lambda-the-ultimate.org/node/451
- http://lambda-the-ultimate.org/node/1002
Paul Graham が Viaweb で Lisp で実践していた、というのがウェブベースアプリケーションのためのLisp。(Google Patentsにもありました。)
the Arc Challenge は、もしこれが端末のプログラムなら楽勝で書けるでしょう。
read("input %s",said); read("click here"); print("you said %s", said);
ただ、CGIはリクエストごとに終了してしまうんです。こんな気分です。
$ ./said 0 input > hoge $ ./said 1 click here > $ ./said 2 you said hoge
それで、CGIでは、
- hoge を保存しておく
- read,read,print の3つのステージに番号を振っておく、といった処理が必要になります。
そうすると、プログラムのコードは、ステージ番号の場合わけからはじまるような、もともとの制御フローが分断された、細切れが脆くよせ集まったようなコードになってしまいます。
- そうだ、こうしたらどうだろう、仮想マシンで、スナップショットをとるんだ!それならコードは元のままでいいぞ!
read("input %s",said); ここでスナップショットをとる。仮想マシン終了。静かにリクエストを待つ。そしてリジューム。 read("click here"); ここでスナップショットをとる。仮想マシン終了。静かにリクエストを待つ。そしてリジューム。 print("you said %s", said);
で、このスナップショットが、つまり、継続、でしょうか。ゴホン。