defineとset!の違い

(全然解釈を間違っている気がするので、見直します。)
http://d.hatena.ne.jp/yukichanko/20090819/1250700640
で、少し思ったこと。『defineでも再定義ができるんだったら、とset!の違いって何やねん!!』ですが、SICP p.139の注釈で言及されてますね。

現在のフレームに変数に対する束縛が既にあれば、束縛が変更になる。これは記号の再定義ができるので、便利である。しかし、defineは値を変えるのにも使えると言うことで、set!を明示的に使わなくても代入ができると言う議論が出てくる。

と言うことで、もし、既存のシンボルに対して、defineを使用すると、

  1. シンボルを一旦削除。
  2. 新たにシンボルを生成して、オブジェクトと関連づける。

と言う挙動をしているのだろうか。
既存の変数に対して、defineを使用すると、

  1. 変数テーブルに、新たな変数が追加され、元の同じ変数が隠蔽される。

と言うのが、正しい(静的スコープの意味合いから考えて)解釈ではないか。


とすると、set!は、変数テーブルの参照先を変えるだけで、

  • シンボルのポインタ変数の参照先を新しい値に設定する

と言うことをやっているぽい。

既存の記号の再定義には、エラーか警告を出すべきだ

ぼくもそう思う。Gaucheのオプションとかであったりするのだろうか?