Bug #505
closed1.upto 2 {|i| p i }
Added by shyouhei (Shyouhei Urabe) about 16 years ago. Updated over 13 years ago.
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
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 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 余計なお世話)にブロックを解
釈するようになりました。
Updated by matz (Yukihiro Matsumoto) about 16 years ago
- Status changed from Open to Rejected
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 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 <<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行目が通らないのかが説明できません。
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 shyouhei@ruby-lang.org 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| ...}
はどう頑張ってもメソッ
ド呼び出しとは解釈できません。
たぶん、ここは言葉通りではなく、「説明できません」という表現
にはもうちょっと別の意図が含まれていそうですね。もうちょっと
考えてみます。
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
と
おなじ結合強度に)なら、まだ若干分かるんですが。
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 shyouhei@ruby-lang.org writes:
a {|i| ...}
がメソッド呼び出しとして解釈できるから、で説明で
きると思うのですが。一方、2 {|i| ...}
はどう頑張ってもメソッ
ド呼び出しとは解釈できません。しかし
a
というメソッドはどこにも定義されていないのですから、メソッド呼び
出しとは解釈できないではないですか。
# もちろんここで解釈する主体は「プログラマ」であって「パーサ」ではない
「どこにも定義されていない」という情報はそこまで確実なもので
はないと思うのですが、人間が静的挙動と動的挙動を混同して、そ
の種の知識(or 情報)に振り回されがちであることは認めます。
パーサや評価器にそれぞれの都合があるということは私は知ってますが、それは
私がRubyの中の人だからであって、そのような事情を知らない人からは見えてこ
ない情報です。普通のプログラミング言語を学んできた普通なプログラマなら、
変数はその値をリテラルに書いてあったときと同じ役割をすることを学んでいる
はずです。Rubyの場合は特に1.upto
とか3.times
とか書いて「リテラルも変数も
同じ」感を強調しているのに、この変更はそれらの前提知識に対立しています。
本人はレシーバ以外で「リテラルも変数も同じ」感を強調した覚え
はないのですが、そういう風な受け止め方もあるのですね。言われ
てみれば理解は出来ます。
おせっかいを通すなら、むしろ
1.upto a { ... }
も同じ振る舞い(つまりdo
と
おなじ結合強度に)なら、まだ若干分かるんですが。
なるほど。リテラルであるか変数であるかで振る舞いが異なること
は、一般の(Rubyの事情をよく知らない)ユーザにとって、メンタル
モデルに反したり、混乱を招いたりする可能性があるということで
すね。それはそれで筋が通っていると思います。
問題はどちらに揃えるかですが、ちょっと考えさせてください。
まつもと ゆきひろ /:|)
Updated by matz (Yukihiro Matsumoto) about 16 years ago
- Status changed from Rejected to Assigned
- Priority changed from 5 to Normal
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.
Updated by shyouhei (Shyouhei Urabe) over 7 years ago
- Related to Bug #13547: [].delete 1 { 'NG' } added
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
Updated by shyouhei (Shyouhei Urabe) almost 7 years ago
- Has duplicate Bug #14023: SyntaxError on array argument and block added