コメント欄でshiroさんから教えていただいたので、次の論文に目を通してみました。
- Title: Worlds: Controlling the Scope of Side Effects
- Authors: Alessandro Warth & Alan Kay
- Pages: 10ページ (表紙除く)
- URL: http://www.vpri.org/pdf/rn2008001_worlds.pdf
ワールド(world)とは、クロージャに詰め込むような変数束縛に限らず、副作用の効果もすべて抱え込んでいるような“環境”のことです。この論文は、このような包括的な環境をプログラムから操作できると何が出来るかについて述べています。
WebブラウザとかJavaScriptを例に使って説明しているので分かりやすいと思います。ワールド機能の実験的な実装も Worlds/JS というJavaScript方言です。
ワールド機能は、Catyのリクエスト処理やテスト実行で使っているサンドボックス機能と似てます。しかし、Catyのサンドボックスはランタイムの機能であるのに対して、ワールドは言語機能です。環境が、プログラムから操作可能なデータとして対象化(reify)されています。別な言い方をすると、ワールドはプログラミング言語のファーストクラスのデータなのです。
ワールドの参照と操作には4つのプリミティブがあります。thisWorld、sprout(発芽させる)、in、commit です。
var w = thisWorld; // 現在のワールドを取得する
w2 = w.sprout(); // 子ワールドを生成する
in w2 { this.x = 5; }; // 特定のワールド内でコードを実行する
w2.commit(); // ワールドの変更を親ワールドに反映させる
commitしなければ、親ワールドと子ワールドは別々(平行宇宙?)に時間発展します。子ワールド内の結果が不要ならワールドごと捨ててしまってもかまいません
ワールド内で実行すべきコードを1個の関数fと考えて、function F(w) { in w {f}; return w;} というFを定義し、w1 = F(w0) のようにすると継続渡しと変わんない気もするのですが、僕の気のせいかしら。
ワールドに“本物の世界”をどこまで詰め込めるのか、例えばファイルシステムやデータベースもワールドで表現できるのか? 複数のワールドのcommit間でのコンフリクトの問題はないのか?(「後出しが勝ち」で割り切る?) ワールドの定式化はどういう計算モデルなんだろう? あたりが気になったのですが、このアイディアを検討してみる価値はありそうです。