From: matz@... (Yukihiro Matsumoto) Date: 1998-06-17T18:20:07+09:00 Subject: [ruby-dev:2900] Re: what type are true and false In message "[ruby-dev:2899] Re: [ruby-list:8388] Re: what type are true and false" on 98/06/17, 石塚圭樹 writes: | |けいじゅ@日本ラショナルソフトウェアです. | |何か難しい(@@;;; 同意します ^^;;; |>まあ,直感に反していないというつもりもないんですが,他のとこ |>ろとの兼ね合いで次善だと考えています.現在のrubyの仕様と矛盾 |>が無い方法でこの挙動を直感に合わせるのは難しいでしょう. | |えーと. コンパイル時ではなくて動的にローカル変数を決めるのは, | |* 実装が難しい |* 静的に解釈する方が良い仕様 | |どっち? 既に「現に静的に解釈していて仕様がそれに依存している」です. 具体的には引数なしの識別子がローカル変数にもメソッドにもなる 部分です.他にもあったような…. なお,効率の問題もありますから静的に解決できることは静的に解 決したいという思いはあります. |えーと. | | (proc {foo = 10}).call # ブロック中なのでブロック内ローカル変数 | |これは, やはり静的な構文上で初出かつ入れこのブロック中なのでその入れこ |のブロックのローカル変数になるのでは? ここで「rubyの変数にネストはない」というルールが出て来ます. つまり,ローカル変数にはブロック内変数かそうでないかの2種類 しかなく,それらは名前が同じなら外側のものを使います. # 例外は[ruby-list:8378]だけです. つまり,proc{foo=10}.callが実行される時点ですでにevalによっ てfooというブロック内変数が定義されてしまっているので,そち らの値を変更してしまいます. evalが絡むとこのようなネストしたローカル変数が出て来るのでい やらしいですね.ひとつひとつのルールは合理的なようでも,全体 の動作は良く分からなくなると.まるでperlのようだ.^^;;; 私としても,evalも絡んでどのようにあるべきかということについ て,決定的な見解を持っているわけではありませんので,提案など は大歓迎します. まつもと ゆきひろ /:|)