From: Shin-ichiro HARA Date: 2001-06-17T11:37:57+09:00 Subject: [ruby-dev:13607] Re: Parallel Assignment 原です。 >まつもと ゆきひろです >田中さんの[ruby-dev:13598]での考察をベースにもういちど考え直 >します。考え直すたびにファクターが増えて、脳の容量が足りない >んですけど。もうちょっとキャパシティの大きな脳だったらよかっ >たな。 でも、もうほとんど最終段階ですよね。現状を確認してみます。 まず[ruby-dev:13567](4)つまり、 (1) すべての(多重代入を含む)代入 A = B は、ただ一つの変数xをもって、 x = B A = x と書ける。 という分解を認める事にしました。しかし、x = 1, *[] の値を x == 1 とす るか x == [1] とするかはまだ決まっていません、これは保留にしています。 実は第2段階の A = x の多重代入の仕方もちょっと複雑ですが、多分議論が 分かれる事は無いと思います。 更に、return と yield も同様と考えていいでしょう。つまり、 (2) B オブジェクトあるいはオブジェクトの列とするとき return B は、ただ一つの変数xをもって、 x = B return x と書き直せる。 全く同様に、 (3) B オブジェクトあるいはオブジェクトの列とするとき yield B は、ただ一つの変数xをもって、 x = B yield x と書き直せる。 と、ここまでは確定したといえる。まあ(3)は別解があり得るけど これで確定したとしましょう。 ちなみに、配列が代入された変数 arr を foo(*arr) と、メソッドに送っ たり、yield(*arr) と送ったりする事はあり得るが、return(*arr) とす るコードは、ほとんどあり得ないと言っていいです。なぜならこの時、 多重代入 x = *arr が起こるけど、x の値は、arr の length が 1 か 2 以上かで、(配列の)中身か配列か、という質的な変化が起こってし まい、扱いにくい(情報が落ちる)からです。従って return *arr と書くな、return arr と書け を標語にして良いでしょう。 さて、[ruby-dev:13598]で田中さんは、 >単値 -> 単値 > 代入の右辺 -> 代入の左辺 > return -> メソッドの返り値 > yield -> ブロック引数 > >単値 -> 多値 > yield -> メソッド引数 (Method#to_proc) > >多値 -> 単値 > メソッド呼び出し -> ブロック引数 (define_method) > Method#call -> ブロック引数 (define_method) > Proc#call -> ブロック引数 > Continuation#call -> メソッドの返り値 > >多値 -> 多値 > メソッド呼び出し -> メソッド引数 > Method#call -> メソッド引数 > Proc#call -> メソッド引数 (Method#to_proc) と整理されていますが、このうち、Method#call の「多値 -> 多値」も、 議論の余地はほとんどありません。そのまま送るだけです。 すると残るのは、 (i) x = 1, *[] (ii) Proc#call (iii) Method#to_proc だけ、と言えると思います。