From: matz@... (Yukihiro Matsumoto) Date: 2001-06-08T17:21:02+09:00 Subject: [ruby-dev:13503] Re: yield *[[]] まつもと ゆきひろです In message "[ruby-dev:13496] Re: yield *[[]]" on 01/06/08, Tanaka Akira writes: |いまの挙動で決定というわけでもない(と思っている)のでリリースしないのが |正解かと思います。 今の挙動は私でさえ気がつくバグがあります。 |できれば「新しい挙動は素晴らしい」とか「前のほうが良かった」とか「どっ |ちも気にくわない」とか感想を聞かせていただけると嬉しいですが。 一応、test first programmingの思想にのっとり、「こんな風にし ようと思ってます」という仕様を表現してみようと思います。 で、右辺の * の挙動を、私は「右の式の結果を(配列であれば)展 開してソースコードに埋めこんだときと同じ挙動」と見なしている のに対して、田中さんは「[*r]の省略形」と考えておられるのが違 いなのではないだろうか、という気がしました。 ルールとしては田中さんのものの方がシンプルなのですが(たしか に私の仕様では組み合わせを考えてるとくらくらしました)、互換 性の点から変更が大きすぎるように感じました。といっても、下に 記述した私の挙動でも非互換性があるんですが。 最大の原因は代入の右辺やyieldやreturnの引数が、配列かそうで ないかで、挙動がかなり違う(が、それを無視するわけにはいかな い)って点でしょう。 でも、まだ田中さんの真の意図を読みそこねているような気がする んで、もうちょっと考えてみます。2日前から考えつづけてるんで すが、脳の容量が足りないギミです。 まつもと ゆきひろ /:|) --- asgn.rb def assert(a, b) ai = a.inspect bi = b.inspect if a != b print "failed Assertion: <%s> == <%s>\n" % [ai, bi] else print "Assertion OK: <%s> == <%s>\n" % [ai, bi] end end # 1-1..1-2 a = nil; assert(a, nil) a = 1; assert(a, 1) a = []; assert(a, []) a = [1]; assert(a, [1]) a = [nil]; assert(a, [nil]) a = [[]]; assert(a, [[]]) a = [*[]]; assert(a, []) a = [*[1]]; assert(a, [1]) a = [*[1,2]]; assert(a, [1,2]) # 1-3..1-8 a = *nil; assert(a, nil) a = *1; assert(a, 1) a = *[]; assert(a, nil) a = *[1]; assert(a, 1) a = *[nil]; assert(a, nil) a = *[[]]; assert(a, []) a = *[*[]]; assert(a, nil) a = *[*[1]]; assert(a, 1) a = *[*[1,2]]; assert(a, [1,2]) # 2-1..2-2 *a = nil; assert(a, []) *a = 1; assert(a, [1]) *a = []; assert(a, []) *a = [1]; assert(a, [1]) *a = [nil]; assert(a, [nil]) *a = [[]]; assert(a, [[]]) *a = [*[]]; assert(a, []) *a = [*[1]]; assert(a, [1]) *a = [*[1,2]]; assert(a, [1,2]) # 2-3..2-8 *a = *nil; assert(a, []) *a = *1; assert(a, [1]) *a = *[]; assert(a, []) *a = *[1]; assert(a, [1]) *a = *[nil]; assert(a, []) *a = *[[]]; assert(a, []) *a = *[*[]]; assert(a, []) *a = *[*[1]]; assert(a, [1]) *a = *[*[1,2]]; assert(a, [1,2]) # 3-1..3-2 a,b,*c = nil; assert([a,b,c], [nil, nil, []]) a,b,*c = 1; assert([a,b,c], [1, nil, []]) a,b,*c = []; assert([a,b,c], [nil, nil, []]) a,b,*c = [1]; assert([a,b,c], [1, nil, []]) a,b,*c = [nil]; assert([a,b,c], [nil, nil, []]) a,b,*c = [[]]; assert([a,b,c], [[], nil, []]) a,b,*c = [*[]]; assert([a,b,c], [nil, nil, []]) a,b,*c = [*[1]]; assert([a,b,c], [1, nil, []]) a,b,*c = [*[1,2]]; assert([a,b,c], [1, 2, []]) # 3-3..3-8 a,b,*c = *nil; assert([a,b,c], [nil, nil, []]) a,b,*c = *1; assert([a,b,c], [1, nil, []]) a,b,*c = *[]; assert([a,b,c], [nil, nil, []]) a,b,*c = *[1]; assert([a,b,c], [1, nil, []]) a,b,*c = *[nil]; assert([a,b,c], [nil, nil, []]) a,b,*c = *[[]]; assert([a,b,c], [nil, nil, []]) a,b,*c = *[*[]]; assert([a,b,c], [nil, nil, []]) a,b,*c = *[*[1]]; assert([a,b,c], [1, nil, []]) a,b,*c = *[*[1,2]]; assert([a,b,c], [1, 2, []]) p "----" # 1-1..1-2 def f; yield nil; end; f {|a| assert(a, nil)} def f; yield 1; end; f {|a| assert(a, 1)} def f; yield []; end; f {|a| assert(a, [])} def f; yield [1]; end; f {|a| assert(a, [1])} def f; yield [nil]; end; f {|a| assert(a, [nil])} def f; yield [[]]; end; f {|a| assert(a, [[]])} def f; yield [*[]]; end; f {|a| assert(a, [])} def f; yield [*[1]]; end; f {|a| assert(a, [1])} def f; yield [*[1,2]]; end; f {|a| assert(a, [1,2])} # 1-3..1-8 def f; yield *nil; end; f {|a| assert(a, nil)} def f; yield *1; end; f {|a| assert(a, 1)} def f; yield *[]; end; f {|a| assert(a, nil)} def f; yield *[1]; end; f {|a| assert(a, 1)} def f; yield *[nil]; end; f {|a| assert(a, nil)} def f; yield *[[]]; end; f {|a| assert(a, [])} def f; yield *[*[]]; end; f {|a| assert(a, nil)} def f; yield *[*[1]]; end; f {|a| assert(a, 1)} def f; yield *[*[1,2]]; end; f {|a| assert(a, [1,2])} # 2-1..2-2 def f; yield nil; end; f {|*a| assert(a, [])} def f; yield 1; end; f {|*a| assert(a, [1])} def f; yield []; end; f {|*a| assert(a, [])} def f; yield [1]; end; f {|*a| assert(a, [1])} def f; yield [nil]; end; f {|*a| assert(a, [nil])} def f; yield [[]]; end; f {|*a| assert(a, [[]])} def f; yield [*[]]; end; f {|*a| assert(a, [])} def f; yield [*[1]]; end; f {|*a| assert(a, [1])} def f; yield [*[1,2]]; end; f {|*a| assert(a, [1,2])} # 2-3..2-8 def f; yield *nil; end; f {|*a| assert(a, [])} def f; yield *1; end; f {|*a| assert(a, [1])} def f; yield *[]; end; f {|*a| assert(a, [])} def f; yield *[1]; end; f {|*a| assert(a, [1])} def f; yield *[nil]; end; f {|*a| assert(a, [])} def f; yield *[[]]; end; f {|*a| assert(a, [])} def f; yield *[*[]]; end; f {|*a| assert(a, [])} def f; yield *[*[1]]; end; f {|*a| assert(a, [1])} def f; yield *[*[1,2]]; end; f {|*a| assert(a, [1,2])} # 3-1..3-2 def f; yield nil; end; f {|a,b,*c| assert([a,b,c], [nil, nil, []])} def f; yield 1; end; f {|a,b,*c| assert([a,b,c], [1, nil, []])} def f; yield []; end; f {|a,b,*c| assert([a,b,c], [nil, nil, []])} def f; yield [1]; end; f {|a,b,*c| assert([a,b,c], [1, nil, []])} def f; yield [nil]; end; f {|a,b,*c| assert([a,b,c], [nil, nil, []])} def f; yield [[]]; end; f {|a,b,*c| assert([a,b,c], [[], nil, []])} def f; yield [*[]]; end; f {|a,b,*c| assert([a,b,c], [nil, nil, []])} def f; yield [*[1]]; end; f {|a,b,*c| assert([a,b,c], [1, nil, []])} def f; yield [*[1,2]]; end; f {|a,b,*c| assert([a,b,c], [1, 2, []])} # 3-3..3-8 def f; yield *nil; end; f {|a,b,*c| assert([a,b,c], [nil, nil, []])} def f; yield *1; end; f {|a,b,*c| assert([a,b,c], [1, nil, []])} def f; yield *[]; end; f {|a,b,*c| assert([a,b,c], [nil, nil, []])} def f; yield *[1]; end; f {|a,b,*c| assert([a,b,c], [1, nil, []])} def f; yield *[nil]; end; f {|a,b,*c| assert([a,b,c], [nil, nil, []])} def f; yield *[[]]; end; f {|a,b,*c| assert([a,b,c], [nil, nil, []])} def f; yield *[*[]]; end; f {|a,b,*c| assert([a,b,c], [nil, nil, []])} def f; yield *[*[1]]; end; f {|a,b,*c| assert([a,b,c], [1, nil, []])} def f; yield *[*[1,2]]; end; f {|a,b,*c| assert([a,b,c], [1, 2, []])}