まつもと ゆきひろです

In message "[ruby-dev:17747] Re: self in block"
    on 02/07/21, masaki <GEC01122 / nifty.ne.jp> writes:

||すみません。私にとって「自然」というのは意味がないので、どう
||してそのselfが無名関数自身を指すべきなのか、それから正木さん
|
|何を自然と思うかという感覚は、非常に大事なことだと思っていますが、

それには同意しますが、「何を自然と思うかという感覚」は主観的
であることを考えると、あることをある人が自然であると感じるか
どうかは私にとってはほとんど意味がないです。

|ここで
|Fact=Function.new({0=>1}){"|n| n*self[n-1] "}
|
|Fact=Function.new({0=>1}){"|n| n*Fact[n-1] "}
|を比べると、後者は、本来不必要な関数名、を使っている点で前者より
|劣ります。そのために
|関数名を換えたら block 内の関数名もそれにあわせて換えないといけない。
|小文字の関数名は使えない。
|といった欠陥が生じます。
|前者のような書き方ができるためには self が関数自身を指すことが必要です。 

ここだけを考えると、一見selfが関数自身を指すことが良いように
感じられますが、最終的には

  * それがどれだけ頻繁に起きるケースか
  * それがどれだけ不都合か

  * それを実現するために犠牲にする互換性はあるか
  * それを実現することで全体のバランスはどうなるか

ということを勘案して決定する必要があると思います。

さて、無名関数を言語仕様に含む言語はたくさんありますが、無名
のまま再帰を実現する方法を言語仕様として提供しているものは少
数派です(JavaScriptはできたような気がします)。大御所Lispには
ありません。もちろん、Yコンビネータなどの方法がありますが、
実用的にはあまり広く使われているようには思えません。というこ
とは、このケースはほとんど使用されることのない珍しいケースで
はないかというのが私の印象です。ということで、得られるものが
少ないので、導入に対する動機が減るのですが、その一方で、仮に
これを実現するのにProcの意味を変更しては互換性において大問題
です。しかも、「原則的にブロック内部のselfは変わらない」とい
う原則がないがしろになるという効果は私には受け入れがたく感じ
ます。

私はかつてRuby/Tkでこの原則を曲げましたが、どっちかっていう
とそれからずっと後悔し続けています。些細なメリットのために同
じ後悔をしたいとは思っていません。

                                まつもと ゆきひろ /:|)