From: matz@... (Yukihiro Matsumoto) Date: 2003-02-17T02:20:22+09:00 Subject: [ruby-list:37112] Re: Local variables & blocks まつもと ゆきひろです また、風邪ひいたらしい。虚弱な... In message "[ruby-list:37110] Re: Local variables & blocks" on 03/02/17, ichimal@fenix.ne.jp writes: |> 鈴木さんの「未初期化」はどちらかというと前者の意味が強いと思 |> います。 | | いえ、私は純粋に後者を指して未初期化と呼んでいます。新スコープルール |下でブロック内に新変数への代入式があれば、静的に (メソッドに局所的な) |変数が定義されるわけです。現状ではその変数の初期値として nil を使う方 |針で言語設計がなされていますが、そこに異を唱えたのがそもそもの話です。 | | つまり、未初期化の定義自体への異義です。 了解です。だいぶ誤解をしていたのかもしれません。 とにかく、未定義については合意できたのでこれ以上考える必要は ないということで。ただ、未定義について後の方でちょっと述べら れているので、そこだけ先に解決しておきましょう。 |> 未定義、つまりその変数が定義されていない場合にはアクセスその |> ものがエラーになりますから、値はありません。ですから、未定義 |> の変数の値は存在しないので定義する必要はありません。 | | これは全面的に同意します。未初期化かどうかが問題になるのはあくまで定 |義された変数についてです。 | |> 仮に上で述べた「未定義値」が存在する(必要がある)のであれば、 |> その値は本題(1)で示されたような性質 |snip |> に加えて真偽値としての性質も持たない方が良いという主張は理解 |> できます。 | | :-) | |> しかし、そもそも未定義値は存在しない(する必要がない)と考えます。 | | 「する必要がない」という表現に、強い policy を感じますね。 そうですか? 私にとっては当然の論理的帰結なのですが、 * 未定義変数は存在しない(これは合意がありますよね) * よって存在しない未定義変数の値たる未定義値は存在しない ここの主張が「未初期化値が存在しない(する必要がない)」という 主張でない点が重要です。 さて、これで「未定義」については忘れて本題の「未初期化」につ いて語りましょう。 | 「未初期化と同じ無効な値を代入する」という概念は、未初期化値を (トリッ |キーな手法に頼ることなく) 明に代入できるという前提を必要とします。私は |そのような前提は、妥協案としては可能であるにせよ、間違っていると考えま |す。 | | ですから、上記引用部分の私の意見は、件の前提下では成立しないと考える |ことが可能であることには同意しますが、そもそもの前提が間違っているとい |う立場の下、同意できません。 「妥協案としては可能であるにせよ、間違っている」という表明は * 実用上問題が少ない(あるいはない) * しかし、正しくはない ということを含むと思いますが、これで良いですか? プラグマティストである私にとって実用上問題がなければ、それで 良いという思いもあるのですが、それはそれとして、まず * 問題が「少ない」のか「ない」のかどちらであるか という点が気になります。少なくても問題があるのであればそれは 手当てされなければならない、少なくとも検討されなければならな いと考えるからです。私には問題があるのかどうかよくわかりませ んでした。次に、 * 間違っている というのがどう間違っているかという点がよく分かりませんでした。 例としては | 私は、件の前提が (有用かどうかではなく) 妥当であるためには | |x = x # 変数 x はここで初出 | |の結果が nil になるように定義されている理由に、便利さ以上の論理的妥当 |性が必要だと考えます。この点についてはどうお考えでしょうか。 と挙げられていますが、こんなのは正直実装上の都合で、 * 意味がないから無効値 程度の意味しかありません。別にエラーでもよかったんですけど、 そのまま実装したらこうなったというだけのことです。これをもっ て |未初期化値を (トリッキーな手法に頼ることなく) 明に代入でき |るという前提 が間違っているというのは納得できません。x=xは十分トリッキー だと思うし。 double meaningだとおっしゃているのが理由といえば理由かもしれ ませんが、double meaningってのは「nilが無効値と未初期化値の 両方の役割を兼ねている」という意味でしょうから、 無効値と未初期化値を区別する必要がある という前提を導入しているだけのように感じられます。もちろん、 区別した体系が存在しうること、そういう体系が存在すればその体 系に依存したプログラムが書かれるだろうことには異論はありませ んが、それはその前提がそうでない前提よりも優れている論拠には ならないのではないかと思います。 | そして、この double meaning は互換性の問題を考えても解消可能な範疇に |あると考えます。というのは (1) 田中さんが示したような現状でも存在する |「定義されているが未初期化」状態を生成するようなコードが、つまるところ |「そのようにも書ける」というだけのものに過ぎず、また (2) 新スコープルー |ルへの移行自体に非互換性が存在するからです。 えーと、具体的な体系が例示されていないので解消可能かどうか現 時点では判断できません。 | というわけで、無効値と未初期化値に違いがあるかどうかを、純粋に概念的 |な観点と「Rubyかくあるべし論 (現行版)」と「Rubyかくあるべし論 (将来版)」 |で切り分けた上での御意見を伺いたいです。 現時点では、私は「無効値と未初期化値を区別する必要性(あるい は嬉しさ)」を理解していません。区別しないことは * 実用上不便な点がない * 体系がより単純 というメリットがあり、それは導入することによって得られるメリッ ト(が現時点ではひとつも思いつかないんですが)より大きいと思い ます。それに、導入することによって可能になるプログラミングス タイルは決してわざわざ推奨すべきスタイルに私には思えませんし。 | これらを同義とするように定義することも可能だ、ということは認めます。 |しかし、それはプログラミング言語設計における policy matter であって、 |根本的には別概念だと主張します。 未初期化値と無効値が別概念という体系が存在しうることは認めま す。逆に特に未初期化値がない(無効値の役割のひとつ)という体系 も存在できると思います。 | 無効値の代表値を返すくらいなら例外の方がましだと考えます。そもそも無 |効値の代表値を返して何が嬉しいんだかさっぱりわかりません。 いや、これがですね。ときどき便利なんですよ。たぶん、便利だと 感じるのはCなどに汚染された古い考え方の頭脳だとは思うんです が。indexが例外を返したら使いにくいとかgetsが例外を返してほ しくないとか。 |2千5百通強の未読メールを処理するのは苦痛だった… 鈴木信吾 ちょっと間を開けると溜まっちゃいますよねえ。 まつもと ゆきひろ /:|)