Bug #505

1.upto 2 {|i| p i }

Added by Shyouhei Urabe over 6 years ago. Updated almost 4 years ago.

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

Description

=begin
いつのまにか1.upto 2 {|i| p i }が通ります。

ruby -ve '1.upto 2 {|i| p i}'
ruby 1.9.0 (2008-08-27 revision 17576) [x86_64-linux]
1
2

1.8では例外です。

ruby -ve '1.upto 2 {|i| p i}'
ruby 1.8.7 (2008-08-12 revision 17572) [x86_64-linux]
-e:1: syntax error, unexpected '{', expecting $end
1.upto 2 {|i| p i}
^
=end

History

#1 Updated by Yukihiro Matsumoto over 6 years ago

=begin
まつもと ゆきひろです

In message "Re: [Bug #505] 1.upto 2 {|i| p i }"
on Wed, 27 Aug 2008 19:08:15 +0900, Shyouhei Urabe redmine@ruby-lang.org writes:

|Bug #505: 1.upto 2 {|i| p i }
|http://redmine.ruby-lang.org/issues/show/505
|
|起票者: Shyouhei Urabe
|ステータス: Open, 優先度: High
|担当者: Yukihiro Matsumoto, カテゴリ: core
|
|いつのまにか1.upto 2 {|i| p i }が通ります。
|
| ruby -ve '1.upto 2 {|i| p i}'
| ruby 1.9.0 (2008-08-27 revision 17576) [x86_64-linux]
| 1
| 2
|
|1.8では例外です。
|
| ruby -ve '1.upto 2 {|i| p i}'
| ruby 1.8.7 (2008-08-12 revision 17572) [x86_64-linux]
| -e:1: syntax error, unexpected '{', expecting $end
| 1.upto 2 {|i| p i}

1.9での仕様変更です。より親切(or 余計なお世話)にブロックを解
釈するようになりました。

=end

#2 Updated by Yukihiro Matsumoto over 6 years ago

  • Status changed from Open to Rejected

=begin

=end

#3 Updated by Shyouhei Urabe over 6 years ago

=begin
卜部です。

Yukihiro Matsumoto さんは書きました:

まつもと ゆきひろです

In message "Re: [Bug #505] 1.upto 2 {|i| p i }"
on Wed, 27 Aug 2008 19:08:15 +0900, Shyouhei Urabe redmine@ruby-lang.org writes:

|Bug #505: 1.upto 2 {|i| p i }
|http://redmine.ruby-lang.org/issues/show/505
|
|起票者: Shyouhei Urabe
|ステータス: Open, 優先度: High
|担当者: Yukihiro Matsumoto, カテゴリ: core
|
|いつのまにか1.upto 2 {|i| p i }が通ります。
|
| ruby -ve '1.upto 2 {|i| p i}'
| ruby 1.9.0 (2008-08-27 revision 17576) [x86_64-linux]
| 1
| 2
|
|1.8では例外です。
|
| ruby -ve '1.upto 2 {|i| p i}'
| ruby 1.8.7 (2008-08-12 revision 17572) [x86_64-linux]
| -e:1: syntax error, unexpected '{', expecting $end
| 1.upto 2 {|i| p i}

1.9での仕様変更です。より親切(or 余計なお世話)にブロックを解
釈するようになりました。

それはさすがに余計なお世話というものでしょう。

% trunk/bin/ruby <': undefined method `a' for main:Object (NoMethodError)

なぜ3行目が通らないのかが説明できません。

=end

#4 Updated by Yukihiro Matsumoto over 6 years ago

=begin
まつもと ゆきひろです

In message "Re: Re: [Bug #505] 1.upto 2 {|i| p i }"
on Thu, 28 Aug 2008 00:31:36 +0900, Urabe Shyouhei shyouhei@ruby-lang.org writes:

|> 1.9での仕様変更です。より親切(or 余計なお世話)にブロックを解
|> 釈するようになりました。
|
|それはさすがに余計なお世話というものでしょう。
|
|% trunk/bin/ruby <': undefined method `a' for main:Object (NoMethodError)
|
|なぜ3行目が通らないのかが説明できません。

え?

a {|i| ...} がメソッド呼び出しとして解釈できるから、で説明で
きると思うのですが。一方、2 {|i| ...} はどう頑張ってもメソッ
ド呼び出しとは解釈できません。

たぶん、ここは言葉通りではなく、「説明できません」という表現
にはもうちょっと別の意図が含まれていそうですね。もうちょっと
考えてみます。

=end

#5 Updated by Shyouhei Urabe over 6 years ago

=begin
卜部です。

むろん、私自身は理解していますが、他人に説明ができないという話です。

Yukihiro Matsumoto さんは書きました:

え?

a {|i| ...} がメソッド呼び出しとして解釈できるから、で説明で
きると思うのですが。一方、2 {|i| ...} はどう頑張ってもメソッ
ド呼び出しとは解釈できません。

しかしaというメソッドはどこにも定義されていないのですから、メソッド呼び
出しとは解釈できないではないですか。
# もちろんここで解釈する主体は「プログラマ」であって「パーサ」ではない

たぶん、ここは言葉通りではなく、「説明できません」という表現
にはもうちょっと別の意図が含まれていそうですね。もうちょっと
考えてみます。

パーサや評価器にそれぞれの都合があるということは私は知ってますが、それは
私がRubyの中の人だからであって、そのような事情を知らない人からは見えてこ
ない情報です。普通のプログラミング言語を学んできた普通なプログラマなら、
変数はその値をリテラルに書いてあったときと同じ役割をすることを学んでいる
はずです。Rubyの場合は特に1.uptoとか3.timesとか書いて「リテラルも変数も
同じ」感を強調しているのに、この変更はそれらの前提知識に対立しています。

おせっかいを通すなら、むしろ 1.upto a { ... } も同じ振る舞い(つまりdoと
おなじ結合強度に)なら、まだ若干分かるんですが。

=end

#6 Updated by Yukihiro Matsumoto over 6 years ago

=begin
まつもと ゆきひろです

In message "Re: Re: [Bug #505] 1.upto 2 {|i| p i }"
on Thu, 28 Aug 2008 01:00:56 +0900, Urabe Shyouhei shyouhei@ruby-lang.org writes:

|> a {|i| ...} がメソッド呼び出しとして解釈できるから、で説明で
|> きると思うのですが。一方、2 {|i| ...} はどう頑張ってもメソッ
|> ド呼び出しとは解釈できません。
|
|しかしaというメソッドはどこにも定義されていないのですから、メソッド呼び
|出しとは解釈できないではないですか。
|# もちろんここで解釈する主体は「プログラマ」であって「パーサ」ではない

「どこにも定義されていない」という情報はそこまで確実なもので
はないと思うのですが、人間が静的挙動と動的挙動を混同して、そ
の種の知識(or 情報)に振り回されがちであることは認めます。

|パーサや評価器にそれぞれの都合があるということは私は知ってますが、それは
|私がRubyの中の人だからであって、そのような事情を知らない人からは見えてこ
|ない情報です。普通のプログラミング言語を学んできた普通なプログラマなら、
|変数はその値をリテラルに書いてあったときと同じ役割をすることを学んでいる
|はずです。Rubyの場合は特に1.uptoとか3.timesとか書いて「リテラルも変数も
|同じ」感を強調しているのに、この変更はそれらの前提知識に対立しています。

本人はレシーバ以外で「リテラルも変数も同じ」感を強調した覚え
はないのですが、そういう風な受け止め方もあるのですね。言われ
てみれば理解は出来ます。

|おせっかいを通すなら、むしろ 1.upto a { ... } も同じ振る舞い(つまりdoと
|おなじ結合強度に)なら、まだ若干分かるんですが。

なるほど。リテラルであるか変数であるかで振る舞いが異なること
は、一般の(Rubyの事情をよく知らない)ユーザにとって、メンタル
モデルに反したり、混乱を招いたりする可能性があるということで
すね。それはそれで筋が通っていると思います。

問題はどちらに揃えるかですが、ちょっと考えさせてください。

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

=end

#7 Updated by Yukihiro Matsumoto over 6 years ago

  • Status changed from Rejected to Assigned
  • Priority changed from High to Normal

=begin

=end

#8 Updated by Yukihiro Matsumoto over 6 years ago

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

=begin
Applied in changeset r19197.
=end

Also available in: Atom PDF