朝、ふと見ると、次女のほっぺたが膨らんでいる。あらら。
今日は結婚記念日(14年目)なので、なにかしようかと思ったが、 病人がいるのでは仕方がなくおとなしくしていることにする。
実家には妹が戻ってきているので、会いに行きたかったのだが、 おたふく風邪を蔓延させてもいかんしなあ。
たとえば
foo(x) if x = bar()
のようなコードではxへの代入がfoo(x)での参照よりも後ろに来ているので、 前のxはメソッド呼び出しとして解釈されてしまう。 [ruby-core:06684]では、上記のコードを
if x = bar() foo(x) end
と完全に同一にすることが提案されている。
が、正直あんまり乗り気じゃない。
ま、実装が面倒くさい(2パスかバックパッチングが必要になる)というのが最大の理由だが、 そのような面倒な処理を行って発生する違いというのは
くらいだから。それに結局
loop do p a a = 5 end
とか
if false a = 5 end p a
のようなコードで発生する「実際の代入処理の実行(動的)と代入文によるローカル変数の宣言(静的)」の問題がすべて解決するわけでない以上、あんまり嬉しくないのではないだろうか。
ここで、(どうせ2パスにするなら)もう一歩進めて、「そのメソッド内で代入の左辺に登場する識別子はどこでもローカル変数とみなす」というルールを導入することが考えられる。これなら、上にあげたloopやifのものにも対応できる。
しかし、このルールには、ある識別子がローカル変数かどうかメソッド全体を見ないとわからないので、 コードの理解しやすさが下がる危険性がある。メソッドが小さい時はいいけど、大きなメソッドがないとは限らないし。まあ、(かっこを省略した)無引数メソッド呼び出しと同名のローカル変数が共存するときにしか、問題にならないので、気にすることはないのかもしれないけど。