In message <37101487.99F62C1C / st.rim.or.jp>
Inaba Hiroto <inaba / st.rim.or.jp> writes:

> この環境の解釈はLispではそのとおりですが、rubyではあまりあてはまりませ
> ん。rubyでは関数(メソッド)が呼び出された時すべてのローカル変数が未束縛
> な新しい環境が与えられます。そしてローカル変数の解釈に現在の環境以外は
> 使いません。グローバル変数の環境は1つしかないですから、あんまりスタッ
> クというイメージはありません。

前の説明が省略しすぎでした.あれだと dynamic binding しか説明できない
し.「環境をスタックに積むタイミングはさまざまだし,シンボルの種類に
よってそのシンボルがスタックトップの環境中に存在しなかった場合の挙動は
変わり得る」っていうことで.... だったらスタックに固執する事もないか.
「複数のスタックが存在する」でもいいけど.

# 「全てのローカル変数が未束縛な新しい環境が与えられる」なら「前の環境
# を保存するためにスタックにするのが自然だろう」とは思います.ただ右辺
# のシンボルが見付からない場合にはエラーにするだけ.


最初に考えていたのがものすごく一般的な事なので ruby に直接対応させるの
は大変ですね.クラス/モジュールのコンテキストが変わる時とメソッド呼び
出しの時ぐらいに環境がスタックに積まれ,ローカル変数*以外*のシンボルの
解決にはスタック上で「下」の環境が参照され得る.

グローバル変数用の環境(ただ一つ)とインスタンス変数用の環境スタック
(おおむね継承順に積む)とローカル変数用環境スタック(メソッド呼び出し
毎に積まれる.シンボルが見付からなくても「下」の環境は見ない)ぐらいで
考えた方がすっきりしますね.「インスタンス変数用の環境」はちょっと面倒
くさい扱いになりますが.


> > 値としてのオブジェクトと,シンボルと値との結び付きを記録した環境だけが
> > 実体であり,『変数(シンボル)』はプログラムの字面上のみに現れる便宜上
> > の存在に過ぎない.
> 
> 確かに変数は実体ではないんですが、変数を単純にシンボルと呼び変えてしまう
> とシンボルの同一性(名前が同じであること)が変数の同一性と一致しないんで
> す。変数の同一性は環境とシンボルの組で得られるので。

ですね.「シンボルと環境」で考え出した時点で「変数」という概念がどこか
にいってしまったのでした.「単純に呼び変えた」自覚がそもそもない (^^;

「環境が違えばシンボルの意味が違うのは当然である」という暗黙の前提がど
こかで導入されている.勝手に枠組を変えておいて,その上無意識にいろいろ
な仮定をおいてしまっていては話が通じにくくなるのも当然ですね.反省.

-- 
柳川和久 @ 東大阪市 . 大阪府                                 April 12, 1999
It is comparison that makes men happy or miserable.