Project

General

Profile

Actions

Bug #3456

closed

bisarre comma

Added by shyouhei (Shyouhei Urabe) over 14 years ago. Updated over 13 years ago.

Status:
Closed
Target version:
ruby -v:
-
Backport:
[ruby-dev:41654]

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


Related issues 1 (1 open0 closed)

Related to Ruby master - Feature #19107: Allow trailing comma in method signatureOpenActions
Actions #1

Updated by mame (Yusuke Endoh) over 14 years ago

  • Status changed from Assigned to Rejected

遠藤です。

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

2010年6月20日15:48 Nobuyoshi Nakada :

なかだです。

At Sun, 20 Jun 2010 02:04:50 +0900,
Shyouhei Urabe wrote in [ruby-dev:41654]:

ひょっとして意図的なのかもしれませんが、以下のような謎の , が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

Actions #2

Updated by knu (Akinori MUSHA) over 14 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にしたということではないでしょうか。

Actions #3

Updated by shyouhei (Shyouhei Urabe) over 14 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にはなりません。

Actions #4

Updated by mame (Yusuke Endoh) over 14 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

Actions #5

Updated by shyouhei (Shyouhei Urabe) over 14 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したほうがよいと思います。

Actions #6

Updated by mame (Yusuke Endoh) over 14 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

Updated by ko1 (Koichi Sasada) over 13 years ago

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

Updated by matz (Yukihiro Matsumoto) over 13 years ago

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

Updated by matz (Yukihiro Matsumoto) over 13 years ago

まつもと ゆきひろです

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

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

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

Updated by shyouhei (Shyouhei Urabe) over 13 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, -> { }

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

Updated by matz (Yukihiro Matsumoto) over 13 years ago

まつもと ゆきひろです

In message "Re: [ruby-dev:43755] Re: [Ruby 1.9 - Bug #3456] bisarre comma"
on Sun, 12 Jun 2011 00:17:05 +0900, Urabe Shyouhei 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行削るだけだけど、括弧のある場合
だけ許すとなるともうちょっと複雑になるなあ。まあ、ルールひと
つ増やすだけだけど。

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

Updated by shyouhei (Shyouhei Urabe) over 13 years ago

卜部です。

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

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

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

Updated by shyouhei (Shyouhei Urabe) over 13 years ago

卜部です。

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

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

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

Updated by matz (Yukihiro Matsumoto) over 13 years ago

まつもと ゆきひろです

In message "Re: [ruby-dev:43759] Re: [Ruby 1.9 - Bug #3456] bisarre comma"
on Sun, 12 Jun 2011 03:14:43 +0900, Urabe Shyouhei 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;

Updated by matz (Yukihiro Matsumoto) over 13 years ago

まつもと ゆきひろです

In message "Re: [ruby-dev:43760] Re: [Ruby 1.9 - Bug #3456] bisarre comma"
on Sun, 12 Jun 2011 03:33:57 +0900, Yukihiro Matsumoto 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;

Updated by shyouhei (Shyouhei Urabe) over 13 years ago

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

まつもと ゆきひろです

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

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

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

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

Updated by matz (Yukihiro Matsumoto) over 13 years ago

まつもと ゆきひろです

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

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

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

Actions #18

Updated by shyouhei (Shyouhei Urabe) over 13 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).

Updated by naruse (Yui NARUSE) over 13 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 `'

Actions #20

Updated by matz (Yukihiro Matsumoto) over 13 years ago

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

Actions #21

Updated by matz (Yukihiro Matsumoto) over 13 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
Actions #22

Updated by shyouhei (Shyouhei Urabe) almost 2 years ago

  • Related to Feature #19107: Allow trailing comma in method signature added
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0