原です。

|まつもと ゆきひろです

||   a = 1, *[]; p a
||
||は何ですか?私は 1 だと思うんだけど?
|
|現状では [1] です。つまり、

ああ、やっぱり。これは田中さんの([ruby-dev:13528])

|(1) ... = arg, *[] の挙動
|
|% ruby -e 'a, b = [1, 2], *[]; p [a,b]'
|[[1, 2], nil]
|
|*[] が展開されて消えるとすれば、[1, 2] と表示されるというのが意図する
|挙動な気がします。

で指摘した点ですね。そしてまつもとさんが([ruby-dev:13540])

|   a = [1,2],*r
|
|の挙動を考えるときr.length == 0であれば、その意図は
|
|  a = [1,2],
|
|であると考えられます(文法的には許容してませんが)。つまり、左
|辺において  a と a, が区別され単値と多値を区別しているように、
|右辺においても、多値でない単一の配列を表現していると考えた方
|が使いやすいように思うようになりました。

と答えている。


私は a = 1, *[]; p a は 1 でいいと思うんだけどなあ。なぜなら

   0個以上のオブジェクトをカンマで区切って並べたものをリストと
   言います。最後のオブジェクトには * をつけることができます。

を「リスト」の定義としますよね。そうすると [] の中にリストを
置いた時と、= の右側にリストを置いたときは、違う評価(評価と
言っていいかどうかわからないけど)がされる事になります。同じ
にしといた方がシンプルではないかな。


|  a = [1,2],*[]
|
|

|  a = [1,2],
|
|と解釈して
|
|  a = [[1,2]]
|
|になることから導かれています。で、なぜこれがそうかというと、
|仮に
|
|  r1 = [1,2]
|  r2 = []
|
|として
|
|  a = r1,*r2
|
|を評価した場合、
|
|  a = 1,2
|
|という結果が得られたとすると、私の感覚では * のついていない
|r1の方が展開されてしまったように感じられるからです。

a = 1,2 ではなくて a = [1,2] が得られると考えては?どちらの方式
でも他との矛盾は無いようですが。


ところで、私の想像していたのは、

   = の右辺にはリストが置かれる。リストは評価されると「*オブジェクト」
   の展開が起こる。そして展開後、リストは

     要素の数が0個ならnilに、
     1個ならそのまま、
     2個以上だったらArray()で配列に

   されて一つのオブジェクトになって左辺に渡る。

とい2段階モデルです。更に左辺への代入のプロセスを入れると3段階
モデルと言えます。

これはどうでしょう?