Project

General

Profile

Actions

Bug #505

closed

1.upto 2 {|i| p i }

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

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

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


Related issues 3 (0 open3 closed)

Related to Ruby master - Bug #13547: [].delete 1 { 'NG' }ClosedActions
Has duplicate Ruby master - Bug #13691: Word- and symbol array literals not valid where regular array isRejectedActions
Has duplicate Ruby master - Bug #14023: SyntaxError on array argument and blockRejectednobu (Nobuyoshi Nakada)Actions
Actions #1

Updated by matz (Yukihiro Matsumoto) about 16 years ago

まつもと ゆきひろです

In message "Re: [ruby-dev:36008] [Bug #505] 1.upto 2 {|i| p i }"
on Wed, 27 Aug 2008 19:08:15 +0900, Shyouhei Urabe 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 余計なお世話)にブロックを解
釈するようになりました。

Actions #2

Updated by matz (Yukihiro Matsumoto) about 16 years ago

  • Status changed from Open to Rejected
Actions #3

Updated by shyouhei (Shyouhei Urabe) about 16 years ago

卜部です。

Yukihiro Matsumoto さんは書きました:

まつもと ゆきひろです

In message "Re: [ruby-dev:36008] [Bug #505] 1.upto 2 {|i| p i }"
on Wed, 27 Aug 2008 19:08:15 +0900, Shyouhei Urabe 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 <<end
   a = 0;
   1.upto 2 {|i| a = i }
   1.upto a {|i| p i }
end
-:3:in `<main>': undefined method `a' for main:Object (NoMethodError)

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

Actions #4

Updated by matz (Yukihiro Matsumoto) about 16 years ago

まつもと ゆきひろです

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

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

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

% trunk/bin/ruby <<end
   a = 0;   
   1.upto 2 {|i| a = i }
   1.upto a {|i| p i }
end
-:3:in `<main>': undefined method `a' for main:Object (NoMethodError)

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

え?

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

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

Actions #5

Updated by shyouhei (Shyouhei Urabe) about 16 years ago

卜部です。

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

Yukihiro Matsumoto さんは書きました:

え?

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

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

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

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

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

Actions #6

Updated by matz (Yukihiro Matsumoto) about 16 years ago

まつもと ゆきひろです

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

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

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

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

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

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

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

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

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

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

Updated by matz (Yukihiro Matsumoto) about 16 years ago

  • Status changed from Rejected to Assigned
  • Priority changed from 5 to Normal
Actions #8

Updated by matz (Yukihiro Matsumoto) about 16 years ago

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

Applied in changeset r19197.

Actions #9

Updated by shyouhei (Shyouhei Urabe) over 7 years ago

  • Related to Bug #13547: [].delete 1 { 'NG' } added
Actions #10

Updated by nobu (Nobuyoshi Nakada) over 7 years ago

  • Has duplicate Bug #13691: Word- and symbol array literals not valid where regular array is added
Actions #11

Updated by shyouhei (Shyouhei Urabe) almost 7 years ago

  • Has duplicate Bug #14023: SyntaxError on array argument and block added
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0