KURODA Hisao <kuroda@msi.co.jp> writes:

> Narita Takaoki <takaoki@aisoft.co.jp> writes:
> 
> > 静的束縛をする言語というならほとんど理解できるのですが……
> 
> 「静的束縛」って、どういうものをおっしゃってます?
> lexical binding のことでしょうか?

たぶん、なりたさんは「late binding の反対」の意味で使っていらっしゃる
のでしょう(early bindingっていうのかな?)。

OO の人達はlate bindingあるいはdynamic bindingという言葉を、
「関数(メソッド)名と呼び出されるコードの対応が、呼び出し時に決まる」と
言うような意味で使います。C++のvirtualメソッドとか。

Lisp使いが言うbinding(名前と値の対応)とは似てますが、もっと限定された
局面で使う言葉だと思います。

ところで、「再定義を許す」というのが、同じ関数(あるいは同じシグネチャ
を持つメソッド)の定義が、1つのプログラム中に2回以上現れてもエラーとな
らない、と言う意味だとすると、late bindingかどうかと、関数の再定義を許
すかどうかは別の話だと思います。

* late bindingで関数(メソッド)の再定義を許さない言語の例
   … C++ のvirtualメソッドは、late bindingですが実行時に再定義はでき
   ません。

* late bindingではないが、関数の再定義(二重定義)を許す言語の例
   … これまで話題になった再定義とはちょっと違うかも知れませんが、
   MLの関数名と実体の対応はコンパイル時に完全に決まります。同じ名前の
   関数が2つ定義されると、『それ以後の呼び出しでは』新しい定義が参照さ
   れます。すでに古い定義を参照してコンパイルされた部分には影響しません。
   (Lisperには、「関数定義は代入ではなくて、新たな束縛が付け加わる。し
   たがって、すでに作られたclosureには影響しない。」と言うと分かりやす
   いかも。)

                                前田敦司