クロージャについて: コメントありがとうございます。

勝手にプレッシャーを感じながら、これまた勝手に識者の方々にコメントをお願いしていたところ、Rui さんに続いて shiro さんからもコメントを頂きました。
私の発散した記事を読んで頂いた上で、非常に示唆に富んだコメントを頂きまして、本当にありがとうございます。勉強になります。

shiro さんから頂いたコメントは、おおまかに、

  1. 自由変数の扱いに関する Lisp の実装の流れ。(歴史?)
  2. クロージャの寿命が親環境の実行期間に収まる場合は、状態保持の特別な実装は不要。
  3. クロージャと継続の、保持するリソースの違い。

という具合に分けられるかと思います。

(1)、(2) については、先の私のエントリの記述内容を、強力に後押しして頂けた様に感じました。(違っていたらご指摘下さい)
また、ご紹介頂いたポインタ先の論文を、大変興味深く読ませて頂きました。この論文は、ダイナミックスコープである Lisp 実装に於いて、`環境' を扱う場合に認識すべき問題を考察した論文になっており、これも私の発散した思考と重なる部分の多いものでした。
私の考えていた事柄が、大筋では外れていなさそうであることが確認でき、一歩進めた気がするとともに、何だかとてもホッとした気分です。

クロージャと環境の関係は、1960年代後半にいろいろ考察されて理解されるようになったようです。

そして、ご紹介頂いた論文が 1970年に書かれたものということで、現在の状況は様変わりしているのでしょうし、ようやく 35年前に追い付いただけなんですけれど……

(3) はクロージャと継続で着目しているリソースが異なることが説明されていると理解しました。
「束縛環境」が環境フレーム、「アクティベーションレコード」(活動レコードとか活性レコードとか言われるものですよね) がコンティニュエーション (継続) フレームを指していると認識しています。
実際、Gauche では、スタックフレームを、環境フレーム、引数フレーム (束縛変数のフレームのことだと認識しています)、継続 (コンティニュエーション) フレームの三つに分けていて、状況に応じて環境フレームだけヒープに移動 (クロージャの場合) したり、継続フレームだけヒープに移動 (継続の場合) したりしている様ですね。
そして、これらのフレームは線形のリストではなく、ツリー構造として管理されることになるというのが、コメントの主旨かと。
このツリーとして管理する必要があることについては、ご紹介頂いた論文の中でも触れられていました。

また、括弧書きでクロージャとオブジェクトの類似性についてもコメント頂きましたが、`Actor = Closure (mod Syntax)' というのは聞いたことがあります。検索して調べてみたところ、大意としては「オブジェクト? クロージャと変わりないよ。」ということらしいですね。
Lambda: The Ultimate Imperative がご指摘のドキュメントであることは突き止められましたが、本当に情けない話ですが、英語ドキュメントだと読めるのはいつになることやら、というか不可能かもしれません……