まつもと ゆきひろです

In message "[ruby-list:36394] Re: ar=[];ar+=2でエラー"
    on 02/11/07, Tanaka Akira <akr / m17n.org> writes:

|むしろ上から見ていく現在のほうが役割が違う(非対称)な感じがします。現在
|の仕様では then節は else節に影響を与えるけれど、else節は then節に影響
|を与えないわけで。

日本に戻る飛行機の中でうとうとしながら考えていたんですが、や
はり現状の上から見ていくのが私の感覚にしっくりくるんですよね。
なぜかと考えていたのですが、

  * 初期化されえない変数の参照はやっぱり変

    だから、[ruby-list:36403] の「受け入れうる変更」はやっぱ
    りなじまない。

  * でも、なぜかelseに抵抗がない

    たぶん、私の頭の中ではif then else のことを

      if (cond)
        ...
      end
      if (!cond)
        ...
      end

    と把握しているのではないかと推測します。だから、then節が
    else節に影響を与えるがelse節がthen節に影響を受けない非対
    称性が気にならないと。

ということで、どうもRiteの挙動は

  * (通常の)ローカル変数については現状維持

  * ただし、ローカル変数への代入が登場する前に同名の無引数で
    かっこが省略されたメソッド呼び出しがあれば、警告する(な
    かだパッチとほぼ同様の挙動)

としようかなと思っています、今日の時点では。

なお、懸案のブロック内ローカル変数ですが、こっちは

  * ブロックパラメータは基本的にブロックローカル。ローカル変
    数以外のものを指定するとエラーまたは警告になる。

  * その他の変数は(たとえブロック内で初出でも)ブロックローカ
    ルにはならない。

  * ブロックローカルにしたい場合には特別のだ移入を行う。現時
    点での案は

      let a = value

    以前の := を使ったものよりはマシな気が。あと、ブロック内
    ローカル変数の名称が外側のローカル変数と重複した場合には
    警告になる。

という風にしようかなと思っています。非互換ですが、普通の使い
方をしてる場合にはあまり問題にならない非互換性だと思います。
みなさん、今後を考えてちょっとだけ注意してブロック内ローカル
変数を使いましょう。

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