Bug #3456

bisarre comma

Added by Shyouhei Urabe about 5 years ago. Updated about 4 years ago.

[ruby-dev:41654]
Status:Closed
Priority:Normal
Assignee:Yukihiro Matsumoto
ruby -v:- Backport:

Description

=begin
ひょっとして意図的なのかもしれませんが、以下のような謎の , が1.9系でSyntax OKになるのはなんででしょう?

% ruby -wcve 'x y , ;'
ruby 1.8.8dev (2010-06-15 revision 27061) [x86_64-linux]
-e:1: syntax error, unexpected ';'
% ruby -wcve 'x y , ;'

ruby 1.9.3dev (2010-06-19 trunk 28363) [x86_64-linux]
Syntax OK
=end

Associated revisions

Revision 32235
Added by Shyouhei Urabe about 4 years ago

  • parse.y: comma at the end of line is no longer allowed. A patch from Yukihiro Matsumoto . (fixed #3456).

Revision 32235
Added by Shyouhei Urabe about 4 years ago

  • parse.y: comma at the end of line is no longer allowed. A patch from Yukihiro Matsumoto . (fixed #3456).

Revision 32424
Added by Yukihiro Matsumoto about 4 years ago

  • parse.y (opt_call_args): allow trailing comma after assoc argument e.g. 'foo(bar:1,)'. fixed #3456

Revision 32424
Added by Yukihiro Matsumoto about 4 years ago

  • parse.y (opt_call_args): allow trailing comma after assoc argument e.g. 'foo(bar:1,)'. fixed #3456

History

#1 Updated by Yusuke Endoh about 5 years ago

  • Status changed from Assigned to Rejected

遠藤です。

意図はわかりませんが、少なくとも意図した変更であることは確かなよう
ですので、このチケットは閉じます。
rationale は私も興味あるところですが、redmine の外でやりましょう。

2010年6月20日15:48 Nobuyoshi Nakada nobu@ruby-lang.org:

なかだです。

At Sun, 20 Jun 2010 02:04:50 +0900,
Shyouhei Urabe wrote in :

ひょっとして意図的なのかもしれませんが、以下のような謎の , が1.9系でSyntax OKになるのはなんででしょう?

意図的なようです。

r19837 | matz | 2008-10-18 20:49:39 +0900 (Sat, 18 Oct 2008) | 2 lines

  • parse.y (opt_block_arg): allow trailing comma after usual arguments. not after block argument.

--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
中田 伸悦

Yusuke Endoh mame@tsg.ne.jp

#2 Updated by Akinori MUSHA about 5 years ago

array = [
  1,
  2,
]

hash = {
  :a => 1,
  :b => 2,
}

some_method(1, 2, {
  :a => 1,
  :b => 2,
})

は許されるので、

some_method(
  1,
  2,
)

some_method(1, 2,
  :a => 1,
  :b => 2,
)

もOKにしたということではないでしょうか。

#3 Updated by Shyouhei Urabe about 5 years ago

  • Status changed from Rejected to Open

いや、やっぱおかしいです。以下の例を発見しました。

zsh % ruby -ve 'i j,' -e'k i'
ruby 1.9.3dev (2010-06-28 trunk 28452) [x86_64-linux]
-e:2: syntax error, unexpected tIDENTIFIER, expecting keyword_do or '{' or '('

もちろん , がなければsyntax errorにはなりません。

#4 Updated by Yusuke Endoh about 5 years ago

  • Status changed from Open to Rejected

遠藤です。

2 つ目の -e は単に次の行に続いていると判定されるようです。

$ ./ruby -ve 'p 1 +' -e '1'
ruby 1.9.3dev (2010-06-27 trunk 28451) [i686-linux]
2

要するに以下と同じです。

$ ./ruby -ve 'i j,
k i'
ruby 1.9.3dev (2010-06-27 trunk 28451) [i686-linux]
-e:2: syntax error, unexpected tIDENTIFIER, expecting keyword_do or '{' or '('

$ ./ruby -ve 'i j, k i'
ruby 1.9.3dev (2010-06-27 trunk 28451) [i686-linux]
-e:1: syntax error, unexpected tIDENTIFIER, expecting keyword_do or '{' or '('

この仕様の是非は議論の余地がありそうですが、バグではないと考えます。

Yusuke Endoh mame@tsg.ne.jp

#5 Updated by Shyouhei Urabe about 5 years ago

  • Status changed from Rejected to Open

ええと、べつに現状の解説を聞きたいわけではありません。どうしてエラーになるかくらいは確認してから報告しましたので。

で、俺がこれはバグだと思うのは、括弧のあるなしで意味が変わるというのが凶悪だという思うからです。なぜ

i(j,)
k l

がOKで

i j,
k l

がNGなのか、あきらかに混乱のもとです。さらにいうと

i j, do end
k l

も現状OKです。もはやわけわからん。

この行末に,を許そうとした変更はrevertしたほうがよいと思います。

#6 Updated by Yusuke Endoh about 5 years ago

  • Status changed from Open to Assigned
  • Target version changed from 1.9.2 to 2.0.0

遠藤です。

まず、1.9.2 で revert することはありえません。
このチケットは 1.9.x に設定しておきます。
ただ、これは 1.9.1 からある文法なので 1.9.x 中で revert するのも
かなり反対です。

機能自体については、Set[1,2,3,] を許すのは賛成なのですが、
foo(1,2,3,) を許す必要があるとは思いません。
foo(1,2,3,a:1,b:2,) は、微妙なところです。
foo 1,2,3,a:1,b:2, は、卜部さんと同じ理由で許さない方がよさそうな
気がします。

Yusuke Endoh mame@tsg.ne.jp

#7 Updated by Koichi Sasada about 4 years ago

長期的な展望としては,この件はどうなるべきでしょうか.

#8 Updated by Yukihiro Matsumoto about 4 years ago

  • ruby -v changed from ruby 1.9.3dev (2010-06-19 trunk 28363) [x86_64-linux] to -

#9 Updated by Yukihiro Matsumoto about 4 years ago

まつもと ゆきひろです

In message "Re: [Ruby 1.9 - Bug #3456] bisarre comma"
on Sat, 11 Jun 2011 15:06:24 +0900, Koichi Sasada redmine@ruby-lang.org writes:

|長期的な展望としては,この件はどうなるべきでしょうか.

このままなんじゃない? 配列とかで要素の末尾にカンマが置ける
のの延長として文法を変更した気がする。つまり、DSL的に書くと
きに配列やハッシュは末尾にカンマが置けるのに、メソッド呼び出
しには置けないのは気分が良くないって話だったような。

#10 Updated by Shyouhei Urabe about 4 years ago

メールにじかに反応したまつもとさんは読んでないと思うのでコメント#5を再掲
すると、

俺がこれはバグだと思うのは、括弧のあるなしで意味が変わるというのが凶悪だ
という思うからです。なぜ

i(j,)
k l

がOKで

i j,
k l

がNGなのか、あきらかに混乱のもとです。さらにいうと

i j, do end
k l

も現状OKです。もはやわけわからん。

この行末に,を許そうとした変更はrevertしたほうがよいと思います。

これは#5には書いてありませんが、追記すると、

i j, do end
i j, {  }
i j, -> { }

はすべて合法で、かつ、すべて異なる解釈です。意味が分かりません。

#11 Updated by Yukihiro Matsumoto about 4 years ago

まつもと ゆきひろです

In message "Re: Re: [Ruby 1.9 - Bug #3456] bisarre comma"
on Sun, 12 Jun 2011 00:17:05 +0900, Urabe Shyouhei shyouhei@ruby-lang.org writes:

俺がこれはバグだと思うのは、括弧のあるなしで意味が変わるというのが凶悪だ
という思うからです。なぜ

i(j,)
k l

がOKで

i j,
k l

がNGなのか、あきらかに混乱のもとです。

「演算子(この場合はコンマ)が行末にある時には継続」というルー
ルとの組み合わせで発生している現象ですね。このルールを知って
さえいればそんなに混乱しないと思うなあ。

さらにいうと

i j, do end
k l

も現状OKです。もはやわけわからん。

これも同様ですね。行末にコンマが来てないから。

これは#5には書いてありませんが、追記すると、

i j, do end
i j, {  }
i j, -> { }

はすべて合法で、かつ、すべて異なる解釈です。意味が分かりません。

全部違うものだから。異なる解釈である方が当然では。

この行末に,を許そうとした変更はrevertしたほうがよいと思います。

なんかいろいろ言われてますが、はっきりとは書いてないがほのめ
かされてるのだと思う、

括弧のないメソッド呼び出しの引数リストの末尾にコンマの存在
を許すと、おそらくは意図していない行継続が起きてしまい、ユー
ザーが驚く

点だけには同意します。変更したときにこの点には気がついてませ
んでしたし。上にある「混乱のもと」とか「わけわからん」とか
「意味が分かりません」というのは、つまり、このことを言いたかっ
たのかなあ。

で、同意したので、少なくとも「括弧のないメソッド呼び出し末尾
のコンマは許さない」という変更は行いましょう。今、yaccのルー
ルを見たら、revertするのは4行削るだけだけど、括弧のある場合
だけ許すとなるともうちょっと複雑になるなあ。まあ、ルールひと
つ増やすだけだけど。

                            まつもと ゆきひろ /:|)

#12 Updated by Shyouhei Urabe about 4 years ago

卜部です。

まあこれも実はredmineのログには書いてあったわけですが、

  • 卜部は当然yaccとruby -yを読んでから発言しており、現状の解説を求めてい るわけではない。現状がおかしいと言っている。
  • 卜部は括弧がない場合のみ(「行末の,」に言及していますね?)を問題にしてお り、かつ、括弧がある場合の挙動変更はえんどうさんからrejectされているの で、現在話題になっているのは括弧なしの場合のみ。

の二点を再度申し上げ、しかし最終的に同じ結論に至っていただけたようでなに
よりです。やはりこれは驚きますよね。

#13 Updated by Shyouhei Urabe about 4 years ago

卜部です。

まあこれも実はredmineのログには書いてあったわけですが、

  • 卜部は当然yaccとruby -yを読んでから発言しており、現状の解説を求めてい るわけではない。現状がおかしいと言っている。
  • 卜部は括弧がない場合のみ(「行末の,」に言及していますね?)を問題にしてお り、かつ、括弧がある場合の挙動変更はえんどうさんからrejectされているの で、現在話題になっているのは括弧なしの場合のみ。

の二点を再度申し上げ、しかし最終的に同じ結論に至っていただけたようでなに
よりです。やはりこれは驚きますよね。

#14 Updated by Yukihiro Matsumoto about 4 years ago

まつもと ゆきひろです

In message "Re: Re: [Ruby 1.9 - Bug #3456] bisarre comma"
on Sun, 12 Jun 2011 03:14:43 +0900, Urabe Shyouhei shyouhei@ruby-lang.org writes:

|まあこれも実はredmineのログには書いてあったわけですが、
|
|* 卜部は当然yaccとruby -yを読んでから発言しており、現状の解説を求めてい
|るわけではない。現状がおかしいと言っている。
|* 卜部は括弧がない場合のみ(「行末の,」に言及していますね?)を問題にしてお
|り、かつ、括弧がある場合の挙動変更はえんどうさんからrejectされているの
|で、現在話題になっているのは括弧なしの場合のみ。
|
|の二点を再度申し上げ、しかし最終的に同じ結論に至っていただけたようでなに
|よりです。やはりこれは驚きますよね。

いや、見落としがあったのは事実で申し訳ない。とりあえずこんな
パッチを書いて見ました。ちょっと余裕がないのでテストできてま
せん。末尾がassocがケースはどうしようかなあ。

diff --git a/parse.y b/parse.y
index 459cd8b..c48036b 100644
--- a/parse.y
+++ b/parse.y
@@ -2418,6 +2418,10 @@ opt_paren_args   : none

 opt_call_args  : none
        | call_args
+       | args ','
+           {
+             $$ = $1;
+           }
        ;

 call_args  : command
@@ -2491,10 +2495,6 @@ opt_block_arg    : ',' block_arg
            {
            $$ = $2;
            }
-       | ','
-           {
-           $$ = 0;
-           }
        | none
            {
            $$ = 0;

#15 Updated by Yukihiro Matsumoto about 4 years ago

まつもと ゆきひろです

In message "Re: Re: [Ruby 1.9 - Bug #3456] bisarre comma"
on Sun, 12 Jun 2011 03:33:57 +0900, Yukihiro Matsumoto matz@ruby-lang.org writes:

|いや、見落としがあったのは事実で申し訳ない。とりあえずこんな
|パッチを書いて見ました。ちょっと余裕がないのでテストできてま
|せん。末尾がassocがケースはどうしようかなあ。

末尾assocの後ろにもカンマを許すパッチ。

--- a/parse.y
+++ b/parse.y
@@ -2418,6 +2418,18 @@ opt_paren_args   : none

 opt_call_args  : none
        | call_args
+       | args ','
+           {
+             $$ = $1;
+           }
+       | args ',' assocs ','
+           {
+           /*%%%*/
+           $$ = arg_append($1, NEW_HASH($3));
+           /*%
+           $$ = arg_add_assocs($1, $3);
+           %*/
+           }
        ;

 call_args  : command
@@ -2491,10 +2503,6 @@ opt_block_arg    : ',' block_arg
            {
            $$ = $2;
            }
-       | ','
-           {
-           $$ = 0;
-           }
        | none
            {
            $$ = 0;

#16 Updated by Shyouhei Urabe about 4 years ago

(06/12/2011 03:55 AM), Yukihiro Matsumoto wrote:

まつもと ゆきひろです

In message "Re: Re: [Ruby 1.9 - Bug #3456] bisarre comma"
on Sun, 12 Jun 2011 03:33:57 +0900, Yukihiro Matsumoto matz@ruby-lang.org writes:

|いや、見落としがあったのは事実で申し訳ない。とりあえずこんな
|パッチを書いて見ました。ちょっと余裕がないのでテストできてま
|せん。末尾がassocがケースはどうしようかなあ。

末尾assocの後ろにもカンマを許すパッチ。

手元で確認してみた感じとしては、よさそうに思います。少なくとも既存のテス
トはこわれていませんし、私の不満は解消されています。assocをどうするか
は、ここは許したほうが一貫性の面ではよい気がしますが、特に強い意見はあり
ません。

#17 Updated by Yukihiro Matsumoto about 4 years ago

まつもと ゆきひろです

In message "Re: Re: [Ruby 1.9 - Bug #3456] bisarre comma"
on Sun, 12 Jun 2011 15:05:51 +0900, Urabe Shyouhei shyouhei@ruby-lang.org writes:

|> 末尾assocの後ろにもカンマを許すパッチ。
|
|手元で確認してみた感じとしては、よさそうに思います。少なくとも既存のテス
|トはこわれていませんし、私の不満は解消されています。assocをどうするか
|は、ここは許したほうが一貫性の面ではよい気がしますが、特に強い意見はあり
|ません。

確認ありがとうございます。assocの後ろにもカンマを許す方向で
パッチをコミットしようと思います。

#18 Updated by Shyouhei Urabe about 4 years ago

  • Status changed from Assigned to Closed
  • % Done changed from 0 to 100

This issue was solved with changeset r32235.
Shyouhei, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


  • parse.y: comma at the end of line is no longer allowed. A patch from Yukihiro Matsumoto . (fixed #3456).

#19 Updated by Yui NARUSE about 4 years ago

  • Status changed from Closed to Assigned

このコミットから、以下が SyntaxError になるようになりましたが、意図されていますか?

irb(main):001:0> p(foo:123,)
SyntaxError: (irb):1: syntax error, unexpected ')'
from /home/naruse/local/ruby/bin/irb:12:in `'

#20 Updated by Yukihiro Matsumoto about 4 years ago

意図してません。修正します。

#21 Updated by Yukihiro Matsumoto about 4 years ago

  • Status changed from Assigned to Closed

This issue was solved with changeset r32424.
Shyouhei, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


  • parse.y (opt_call_args): allow trailing comma after assoc argument e.g. foo(bar:1,). fixed #3456

Also available in: Atom PDF