defineとset!の違い
(全然解釈を間違っている気がするので、見直します。)
http://d.hatena.ne.jp/yukichanko/20090819/1250700640
で、少し思ったこと。『defineでも再定義ができるんだったら、とset!の違いって何やねん!!』ですが、SICP p.139の注釈で言及されてますね。
現在のフレームに変数に対する束縛が既にあれば、束縛が変更になる。これは記号の再定義ができるので、便利である。しかし、defineは値を変えるのにも使えると言うことで、set!を明示的に使わなくても代入ができると言う議論が出てくる。
と言うことで、もし、既存のシンボルに対して、defineを使用すると、
- シンボルを一旦削除。
- 新たにシンボルを生成して、オブジェクトと関連づける。
と言う挙動をしているのだろうか。
既存の変数に対して、defineを使用すると、
- 変数テーブルに、新たな変数が追加され、元の同じ変数が隠蔽される。
と言うのが、正しい(静的スコープの意味合いから考えて)解釈ではないか。
とすると、set!は、変数テーブルの参照先を変えるだけで、
シンボルのポインタ変数の参照先を新しい値に設定する
と言うことをやっているぽい。
既存の記号の再定義には、エラーか警告を出すべきだ
ぼくもそう思う。Gaucheのオプションとかであったりするのだろうか?