In article <200302161629.h1GGTvJ5008901 / fenix.ne.jp>,
  ichimal / fenix.ne.jp writes:

>> |未初期化値として持ち込むのは、double meaning です。

>   現在も存在しますねぇ。新スコープルールに移行すると double meaning に

> 無効値の代表値である以上、現状で既に double (triple?) meaning だと考え

>   そして、この double meaning は互換性の問題を考えても解消可能な範疇に

というようにたくさん double meaning というのが出て来るのですが、この
double meaning というのは

>> 「未初期化」と「無効である」はほぼ同じです。
>
>   ほぼ同じだ、と妥協することが可能であることは認めます。が、それらはや
> はり概念的に異なるものです。

というところなどから読みとると、nil に「未初期化」と「無効」という 2つ
の概念が両方ついているということを意味していて、それがいけないという主
張のように思えます。

でも、なんでいけないんでしょう?

まず、未初期化というのは変数にまだ代入されていない状況というプログラム
の実装寄りな概念であるのに対し、無効というのはかなり設計(あるいはモデ
ル)寄りで、プログラムそのものというよりはプログラマの頭の中にある概念
だと思います。したがって、それらが異なる概念であるということには同意で
きます。

しかし、プログラミングというのは頭の中の概念をプログラミング言語の概念
に写像する行為ですから、Ruby がそれらの概念を同一視するというのは単に
Ruby がプログラマの代わりに少しプログラミングをしてくれたというだけの
話ではないでしょうか。これのどこがいけないんでしょう?

一般に、言語というものは良くも悪くもそういうプログラミングのやりかたを
さまざまな形で提供するもので、それを提供しない言語はないと思います。ま
た、むしろ積極的に提供することが使いやすさにつながるのではないでしょう
か。なお、少なくとも言語を単純にすればそれを提供しなくなるということは
ありません。極端な例をあげれば、Turing Machine と Lambda Calclus はど
ちらも非常に単純で表現能力も同じですが、やりかたは全く違います。

あと疑問なのは、nil に加えて「もうひとつ」特殊な値を導入するのがなぜい
いのか、ということです。こういう特殊な値は、ある文脈において有効な値の
集合があって、それのどれでもない、つまり無効であることを表現するために
使われるわけですが、そういうものを first class object として導入した途
端にそれも有効な値の一つと考える文脈が生じ得ます。つまり、特殊な値は際
限なく欲しくなり得るわけですが、なぜ、nil に加えてもうひとつ、つまり
2つというのが適切なのでしょうか?

例えば、インスタンス変数のように代入すると有効になり、
remove_instance_variable で無効になる、というような first class object
でない状態による表現とか、あるいは Haskell の Maybe 型 (または ML の
option 型) のように際限なく作れるようにする、という提案ならそういう問
題がなく、きれいだと思うのですが、なぜ 2つ、という 0 でも 1 でも無限で
もない中途半端な数がいいんでしょう?
-- 
[田中 哲][たなか あきら][Tanaka Akira]