無限エクステントと継続

schemeにおける第一級の継続というのはわかりにくい存在である。よくある説明としては、「計算過程の実行スナップショット」というのがあり、私も長くそのようなイメージで捉えていた。継続は関数呼出しで作られるスタックフレームを全部保存したような存在で、継続を呼出すと継続を補足した時点でのスタックフレームを復活させるようなものという風な理解である。過去の私自身の文章を見ても、継続を呼出すことを「巻戻す」と表現している。

しかし、schemeの特徴のひとつである無限エクステント(オブジェクトの寿命は無期限)を思い出すと、関数が呼出されて戻ってきてもその分のスタックフレームが消えてしまうわけではないということになる。C/C++の価値観の延長でスタックが一直線のものと無意識に思っていたが、木のような形でもいいのではないか。コールツリーの形そのままに伸びるスタックである。だとすると継続はスタックフレームにつけられたラベルと考えることが出来る。

以前に継続を使ってジェネレータを実装してみたときにかなり頭をひねったものだが、この考え方を導入するとスタックのふたつの枝を交互に行き来している様子がイメージできて単純に理解できるようになった。

尤も、言語の意味論から言えばスタックフレーム等という概念を持ち込むのは正しくないのかもしれない。だが、あまりメタな概念を持ち出してもさっぱりわからないというのが正直なところ。所詮は趣味なのでそれらしい概念を当て嵌めてわかった気になっていれば充分なのである。

Document ID: 263c5073db272f303c259127c577baf6