環境と継続

現在のsacallopでは、関数適用を次のような(うさん臭い)方法・手順で評価している。

  1. 先頭要素のlambda式の評価でクロージャを生成する時、不完全な環境フレーム(名前だけで、値がまだ対応付けられていない)を作って、クロージャに保持させる*1
  2. 引数を全部評価
  3. 引数にクロージャを適用する時、次の情報から完全な環境フレームを作り、環境(名前検索の際に有効なスコープ)に組み込む。
    • 先ほどの不完全な環境フレーム(名前)
    • 実引数(値)
  4. 拡大された環境のもとで、クロージャの本体を評価する
  5. クロージャの評価が終わったら、さっき追加された環境フレームを直ちスコープから外す*2

おぼろげながら、環境と継続は密接に関係していそうな気がする。というか、それ以前に継続の概念がまだ理解できてないから困る。継続のつかみ所の無さは異常。

プログラミングにおいて継続(けいぞく、continuation、コンティニュエーション)とは、ある計算過程のある瞬間における、その過程の未来全体(デフォルト)を表すもの、あるいは計算過程の実行スナップショットと説明される。

継続 - Wikipedia

*1:現状では、先頭要素を最初に評価しないと手続きなのか構文なのか判断できないためこうしているが、これは間違いなんだと思う。

*2:多分、スコープから外れた環境フレームであっても、call/ccで捕捉されている場合は後ほどその環境が必要になるので、勝手に破棄しちゃダメなんだろうな。ってことはGCも自分でこしらえることになるな。たまらん。これは大興奮だ。(*゚∀゚)=3 ムッハー