the Arc Challenge と継続の関係

Paul Grahamthe Arc Challengeが、盛り上がってます。

スレッドで高ポイントをとっているのは PLT Scheme Web ServerSeasideですね。

もともと、継続をWeb開発に生かすというのがあって、

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);

で、このスナップショットが、つまり、継続、でしょうか。ゴホン。