Bug #3456
bisarre comma
| Status: | Closed | Start date: | 06/20/2010 | |
|---|---|---|---|---|
| Priority: | Normal | Due date: | ||
| Assignee: | % Done: | 100% |
||
| Category: | core | |||
| Target version: | 2.0.0 | |||
| ruby -v: | - |
Description
ひょっとして意図的なのかもしれませんが、以下のような謎の , が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
Associated revisions
* parse.y: comma at the end of line is no longer allowed.
A patch from Yukihiro Matsumoto <matz AT ruby-lang.org>.
(fixed #3456).
* parse.y: comma at the end of line is no longer allowed.
A patch from Yukihiro Matsumoto <matz AT ruby-lang.org>.
(fixed #3456).
* parse.y (opt_call_args): allow trailing comma after assoc
argument e.g. 'foo(bar:1,)'. fixed #3456
* parse.y (opt_call_args): allow trailing comma after assoc
argument e.g. 'foo(bar:1,)'. fixed #3456
History
Updated by mame (Yusuke Endoh) almost 2 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 [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 <mame@tsg.ne.jp>
Updated by knu (Akinori MUSHA) almost 2 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にしたということではないでしょうか。
Updated by shyouhei (Shyouhei Urabe) almost 2 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にはなりません。
Updated by mame (Yusuke Endoh) almost 2 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>
Updated by shyouhei (Shyouhei Urabe) almost 2 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したほうがよいと思います。
Updated by mame (Yusuke Endoh) almost 2 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>
Updated by ko1 (Koichi Sasada) 12 months ago
長期的な展望としては,この件はどうなるべきでしょうか.
Updated by matz (Yukihiro Matsumoto) 12 months ago
- ruby -v changed from ruby 1.9.3dev (2010-06-19 trunk 28363) [x86_64-linux] to -
Updated by matz (Yukihiro Matsumoto) 12 months 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 <redmine@ruby-lang.org> writes:
|長期的な展望としては,この件はどうなるべきでしょうか.
このままなんじゃない? 配列とかで要素の末尾にカンマが置ける
のの延長として文法を変更した気がする。つまり、DSL的に書くと
きに配列やハッシュは末尾にカンマが置けるのに、メソッド呼び出
しには置けないのは気分が良くないって話だったような。
Updated by shyouhei (Shyouhei Urabe) 12 months 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) 12 months 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 <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行削るだけだけど、括弧のある場合
だけ許すとなるともうちょっと複雑になるなあ。まあ、ルールひと
つ増やすだけだけど。
まつもと ゆきひろ /:|)
Updated by shyouhei (Shyouhei Urabe) 12 months ago
卜部です。
まあこれも実はredmineのログには書いてあったわけですが、
* 卜部は当然yaccとruby -yを読んでから発言しており、現状の解説を求めてい
るわけではない。現状がおかしいと言っている。
* 卜部は括弧がない場合のみ(「行末の,」に言及していますね?)を問題にしてお
り、かつ、括弧がある場合の挙動変更はえんどうさんからrejectされているの
で、現在話題になっているのは括弧なしの場合のみ。
の二点を再度申し上げ、しかし最終的に同じ結論に至っていただけたようでなに
よりです。やはりこれは驚きますよね。
Updated by shyouhei (Shyouhei Urabe) 12 months ago
卜部です。
まあこれも実はredmineのログには書いてあったわけですが、
* 卜部は当然yaccとruby -yを読んでから発言しており、現状の解説を求めてい
るわけではない。現状がおかしいと言っている。
* 卜部は括弧がない場合のみ(「行末の,」に言及していますね?)を問題にしてお
り、かつ、括弧がある場合の挙動変更はえんどうさんからrejectされているの
で、現在話題になっているのは括弧なしの場合のみ。
の二点を再度申し上げ、しかし最終的に同じ結論に至っていただけたようでなに
よりです。やはりこれは驚きますよね。
Updated by matz (Yukihiro Matsumoto) 12 months 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 <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;
Updated by matz (Yukihiro Matsumoto) 12 months 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 <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;
Updated by shyouhei (Shyouhei Urabe) 12 months 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 <matz@ruby-lang.org> writes:
>
> |いや、見落としがあったのは事実で申し訳ない。とりあえずこんな
> |パッチを書いて見ました。ちょっと余裕がないのでテストできてま
> |せん。末尾がassocがケースはどうしようかなあ。
>
> 末尾assocの後ろにもカンマを許すパッチ。
手元で確認してみた感じとしては、よさそうに思います。少なくとも既存のテス
トはこわれていませんし、私の不満は解消されています。assocをどうするか
は、ここは許したほうが一貫性の面ではよい気がしますが、特に強い意見はあり
ません。
Updated by matz (Yukihiro Matsumoto) 12 months 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 <shyouhei@ruby-lang.org> writes:
|> 末尾assocの後ろにもカンマを許すパッチ。
|
|手元で確認してみた感じとしては、よさそうに思います。少なくとも既存のテス
|トはこわれていませんし、私の不満は解消されています。assocをどうするか
|は、ここは許したほうが一貫性の面ではよい気がしますが、特に強い意見はあり
|ません。
確認ありがとうございます。assocの後ろにもカンマを許す方向で
パッチをコミットしようと思います。
Updated by shyouhei (Shyouhei Urabe) 11 months 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 <matz AT ruby-lang.org>.
(fixed #3456).
Updated by naruse (Yui NARUSE) 11 months 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 `<main>'
Updated by matz (Yukihiro Matsumoto) 11 months ago
意図してません。修正します。
Updated by matz (Yukihiro Matsumoto) 11 months ago
- Status changed from Assigned to Closed