[#3587] Multiple assignment at yield() — Shin-ichro Hara <sinara@...>

原です。

86 messages 1998/11/17
[#3588] Re: Multiple assignment at yield() — matz@... (Yukihiro Matsumoto) 1998/11/17

まつもと ゆきひろです

[#3589] Re: Multiple assignment at yield() — Shin-ichro Hara <sinara@...> 1998/11/17

原です。

[#3590] Re: Multiple assignment at yield() — matz@... (Yukihiro Matsumoto) 1998/11/17

まつもと ゆきひろです

[#3594] Re: Multiple assignment at yield() — Shin-ichro Hara <sinara@...> 1998/11/18

原です。

[#3595] Re: Multiple assignment at yield() — matz@... (Yukihiro Matsumoto) 1998/11/18

まつもと ゆきひろです

[#3596] Re: Multiple assignment at yield() — Shin-ichro Hara <sinara@...> 1998/11/18

原です。

[#3598] Re: Multiple assignment at yield() — matz@... (Yukihiro Matsumoto) 1998/11/19

まつもと ゆきひろです

[#3600] Re: Multiple assignment at yield() — Shin-ichro Hara <sinara@...> 1998/11/20

原です。

[#3610] Re: Multiple assignment at yield() — Shin-ichro Hara <sinara@...> 1998/11/20

原です。

[#3611] Re: Multiple assignment at yield() — matz@... (Yukihiro Matsumoto) 1998/11/20

まつもと ゆきひろです

[#3622] Re: Multiple assignment at yield() — Shin-ichro Hara <sinara@...> 1998/11/21

原です。

[#3630] Re: Multiple assignment at yield() — shugo@... (MAEDA Shugo) 1998/11/22

前田です。

[#3635] Re: Multiple assignment at yield() — Shin-ichiro Hara <sinara@...> 1998/11/23

原です。

[#3658] Re: Multiple assignment at yield() — matz@... (Yukihiro Matsumoto) 1998/11/24

まつもと ゆきひろです

[#3660] Re: Multiple assignment at yield() — Shin-ichro Hara <sinara@...> 1998/11/24

原です。

[#3722] multiple assignment, yield and return — Shin-ichro Hara <sinara@...> 1998/12/01

原です。

[#3724] Re: multiple assignment, yield and return — Shin-ichro Hara <sinara@...> 1998/12/01

原です。

[#3742] List() — Shin-ichro Hara <sinara@...> 1998/12/04

原です。

[#3743] Re: List() — shugo@... (MAEDA Shugo) 1998/12/06

前田です。

[#3744] Re: List() — Shin-ichiro Hara <sinara@...> 1998/12/06

原です。

[#3755] Re: List() — shugo@... (MAEDA Shugo) 1998/12/07

前田です。

[#3758] Re: List() — Shin-ichro Hara <sinara@...> 1998/12/07

原です。

[#3760] Re: List() — shugo@... (MAEDA Shugo) 1998/12/07

前田です。

[#3761] Re: List() — Shin-ichiro Hara <sinara@...> 1998/12/07

原です。

[#3774] Re: List() — shugo@... (MAEDA Shugo) 1998/12/08

前田です。

[#3780] Re: List() — Shin-ichiro Hara <sinara@...> 1998/12/08

原です。

[#3784] Re: List() — shugo@... (MAEDA Shugo) 1998/12/09

前田です。

[#3788] Re: List() — Shin-ichro Hara <sinara@...> 1998/12/09

原です。

[#3789] Re: List() — MAEDA Shugo <shugo@...> 1998/12/10

前田です。

[#3602] problem of Delegator — keiju@... (Keiju ISHITSUKA)

けいじゅ@日本ラショナルソフトウェアです.

17 messages 1998/11/20
[#3605] Re: problem of Delegator — matz@... (Yukihiro Matsumoto) 1998/11/20

まつもと ゆきひろです

[#3606] Re: problem of Delegator — keiju@... (石塚圭樹 ) 1998/11/20

けいじゅ@日本ラショナルソフトウェアです.

[#3607] Re: problem of Delegator — matz@... (Yukihiro Matsumoto) 1998/11/20

まつもと ゆきひろです

[#3612] Re: problem of Delegator — keiju@... (石塚圭樹 ) 1998/11/20

けいじゅ@日本ラショナルソフトウェアです.

[#3613] Re: problem of Delegator — matz@... (Yukihiro Matsumoto) 1998/11/20

まつもと ゆきひろです

[#3626] block local variable (Re: スコープの範囲) — shugo@... (MAEDA Shugo)

前田です。

47 messages 1998/11/22
[#3628] Re: block local variable (Re: スコープの範囲) — Koji Arai <JCA02266@...> 1998/11/22

新井です。

[#3629] Re: block local variable (Re: スコープの範囲) — shugo@... (MAEDA Shugo) 1998/11/22

前田です。

[#3632] Re: block local variable (Re: スコープの範囲) — Koji Arai <JCA02266@...> 1998/11/22

新井です。

[#3633] Re: block local variable (Re: スコープの範囲) — shugo@... (MAEDA Shugo) 1998/11/22

前田です。

[#3636] Re: block local variable (Re: スコープの範囲) — Shin-ichiro Hara <sinara@...> 1998/11/23

原です。

[#3642] Re: block local variable (Re: スコープの範囲) — Koji Arai <JCA02266@...> 1998/11/23

新井です。

[#3645] Re: block local variable(Re: スコープの範囲) — Shin-ichiro Hara <sinara@...> 1998/11/23

原です。

[#3674] Re: block local variable(Re: スコープの範囲) — Koji Arai <JCA02266@...> 1998/11/25

新井です。

[#3678] Re: block local variable(Re: スコープの範囲) — matz@... (Yukihiro Matsumoto) 1998/11/26

まつもと ゆきひろです

[#3681] Re: block local variable(Re: スコープの範囲) — Kazuhiro HIWADA <hiwada@...> 1998/11/26

ひわだです。

[#3682] Re: block local variable(Re: スコープの範囲) — Shin-ichro Hara <sinara@...> 1998/11/26

原です。

[#3683] Re: block local variable(Re: スコープの範囲) — matz@... (Yukihiro Matsumoto) 1998/11/26

まつもと ゆきひろです

[#3684] Re: block local variable(Re: スコープの範囲) — Shin-ichro Hara <sinara@...> 1998/11/26

原です。

[#3685] Re: block local variable(Re: スコープの範囲) — matz@... (Yukihiro Matsumoto) 1998/11/26

まつもと ゆきひろです

[#3709] ruby-1.1c9 install 中に SEGV — Koji Arai <JCA02266@...>

新井です。

18 messages 1998/11/30

[ruby-dev:3600] Re: Multiple assignment at yield()

From: Shin-ichro Hara <sinara@...>
Date: 1998-11-20 03:47:15 UTC
List: ruby-dev #3600
原です。

In message "[ruby-dev:3598] Re: Multiple assignment at yield()"
    on 98/11/19, Yukihiro Matsumoto <matz@netlab.co.jp> writes:
|
|まつもと ゆきひろです
|
|親知らず抜いて来ました.痛かったです.(;_;)

不幸ですねえ。今時は無痛でできるのかと思ってけど、、、ヤブだった
のかも。:-)


ところで、

|    def each7; @body.each { |x| yield(*x) } end
|  Foo.new([7]).each7 { |x| p x } #=> [7]

これは #=> 7 の typo ですよね。

そうだとするとこれら 18 個の結果は現在の 1.1c のものと全く
一致しています。後退してしまった?

私の、一番最初の提案は

|    def each7; @body.each { |x| yield(*x) } end
|  Foo.new([[7]]).each7 { |x| p x } #=> [7]

これを #=> 7 にしたらどうか、というものでした。
そして次の提案は

|    def each6; @body.each { |*x| yield(x) } end
|  Foo.new([[6]]).each6 { |x| p x } #=> [6]

これを #=> [[6]] にしたらどうかということです。つまり、

  1) yield(*x) は無条件に x の一番外側の [] を剥ぎとって
     代入の右辺に置く
  2) *x = は無条件に右辺に [] を付けて受ける
  3) それ以外はいままで通り

というものです。したがって、、、


||  (1L) 右辺が配列ならリスト化,そうでなければそのまま
||
||  (2L) 先頭に * が付いた変数には代入しなかった残りが配列とし
||       て代入される
|
|とすると(1L)により,右辺がリストでなく,結果が配列でない時に
|は,そのまま左辺に代入されるんですね.その場合,以下の代入は
|どうふるまうべきですか?
|
|        a, b = 5
|        a, *b = 5
|        *a = 5
|
|つまり,配列でないものを多重代入する時の振る舞いという意味で
|すが.

最後の以外はいままで通りであればいいと思います。足らない
スカラー b は b = nil、足らないベクトル *b は b = [] が充
填される、と。最後のは a = [5] です。今まで通り。

#なんか話が戻ってしまったなあ。


|私自身の解釈としては(既に述べましたが),
|
|  * 多重代入の右辺は配列化される
|
|  * 先頭に * が付いた変数には代入しなかった残りが配列として
|    代入される
|
|と思っています.つまり,*a = x と a = x の違いは右辺が配列化
|されるかどうかにあると思っているわけです.


ううむ、分かっているつもりなんですがね。記号で書いてみますね。
配列化を A() で表すと、

A(1)          = [1]
A(1, 2)       = [1, 2]
A([1])        = [1]
A([1, 2])     = [1, 2]
A(1, *[2])    = [1, 2]
A(1, *[2, 3]) = [1, 2, 3]
A(1, *2)      = [1, 2]
A(*[1])       = [1]
A(*[1, 2])    = [1, 2]

となります。次に B() を強制的な配列化とします。A との違いは

B([1])        = [[1]]
B([1, 2])     = [[1, 2]]

だけです。さて、右辺に Array しか許さない(多重)代入を <= と
書きますね。

a, b, *c <= [1, 2, [3]]  #=>  a = 1, b = 2, c = [[3]]
a, *b    <= [1, 2, [3]]  #=>  a = 1, b = [2, [3]]
*a       <= [1, 2, [3]]  #=>  a = [1, 2, [3]]

これはつまり、

a, b, *c <= [1, 2, [3]]  #=>  a = 1, b = 2, c = B([3])
a, *b    <= [1, 2, [3]]  #=>  a = 1, b = B(2, [3])
*a       <= [1, 2, [3]]  #=>  a = B(1, 2, [3])

と B を使っていることになります。


そして現状の多重代入を <== と書くと、

  多重代入「<== ...」とは「<= A(...)」のことである。

といえるわけですね。合ってますか?


話を yield の方に移して、現在の yield(Y) のパラメータの渡し方は
こうですよね。

  |x|      #=>  x = nil   [ Y が0要素のとき ]
                  = Y     [ x = Y が単純代入の形をしているとき ]
                  = A(Y)  [ それ以外 ]

多重代入の左辺の形である X についての |X| は、単に X <== Y を実
行します。

  |*x|     #=>  *x    <== X
  |x, y |  #=>  x, y  <== X
  |x, *y|  #=>  x, *y <== X
  ....

ここまではいいでしょうか?合ってますか?


|ただ,原さんの定義による挙動の方がよりよいことが示されれば,
|変更するのは可能だと思います.鍵は *a という左辺を持つ多重代
|入の解釈かな?

私の提案のスキームについては、昼食を食べてから書きます。(^^;

In This Thread