Forum: Ruby-dev [Ruby 1.9 - Bug #4443] [Open] odd evaluation order in a multiple assignment

F24ff61beb80aa5f13371aa22a35619c?d=identicon&s=25 Yusuke Endoh (Guest)
on 2011-02-24 15:26
(Received via mailing list)
Issue #4443 has been reported by Yusuke Endoh.

----------------------------------------
Bug #4443: odd evaluation order in a multiple assignment
http://redmine.ruby-lang.org/issues/4443

Author: Yusuke Endoh
Status: Open
Priority: Normal
Assignee: Yukihiro Matsumoto
Category:
Target version: 2.0
ruby -v: ruby 1.9.2p0 (2010-08-18 revision 29036) [i686-linux]


遠藤です。core に投げてしまったようなので登録し直し。

Ruby は左から右に評価が進むと信じていたのですが、多重代入で裏切られました。

  def foo
    p :foo
    []
  end
  def bar
    p :bar
  end

  x, foo[0] = bar, 0

bar より foo が左にあるので、:foo 、:bar の順に出力されることを期待するのですが、なんと :bar 、:foo になります。

具体的に何が困るかというと、例えば

  obj, obj.foo = obj.foo, obj

には swap
を期待するわけですが、そうなりません。こういうコードは実際に、木の回転などを実装するときにしばしば書きたくなります。この挙動に気がついたのも
splay tree を実装していたときでした。こんなの:

  t.left, t.left.right, t = t.left.right, t, t.left

1.9 系列で修正すべきとまでは思いませんが、2.0 で直る可能性はあるでしょうか。

IRC で話したら「それで普通」みたいな反応もありましたが、

  foo[0] = bar

はちゃんと :foo 、:bar の順に出ます。

--
Yusuke Endoh <mame@tsg.ne.jp>
C4e88907313843cf07f6d85ba8162120?d=identicon&s=25 Koichi Sasada (Guest)
on 2011-06-11 08:50
(Received via mailing list)
Issue #4443 has been updated by Koichi Sasada.


まつもとさん,こちらいかがでしょうか.
直せと言われたら私なのかなぁ.
----------------------------------------
Bug #4443: odd evaluation order in a multiple assignment
http://redmine.ruby-lang.org/issues/4443

Author: Yusuke Endoh
Status: Assigned
Priority: Normal
Assignee: Yukihiro Matsumoto
Category:
Target version: 2.0
ruby -v: ruby 1.9.2p0 (2010-08-18 revision 29036) [i686-linux]


=begin
遠藤です。core に投げてしまったようなので登録し直し。

Ruby は左から右に評価が進むと信じていたのですが、多重代入で裏切られました。

  def foo
    p :foo
    []
  end
  def bar
    p :bar
  end

  x, foo[0] = bar, 0

bar より foo が左にあるので、:foo 、:bar の順に出力されることを期待するのですが、なんと :bar 、:foo になります。

具体的に何が困るかというと、例えば

  obj, obj.foo = obj.foo, obj

には swap
を期待するわけですが、そうなりません。こういうコードは実際に、木の回転などを実装するときにしばしば書きたくなります。この挙動に気がついたのも
splay tree を実装していたときでした。こんなの:

  t.left, t.left.right, t = t.left.right, t, t.left

1.9 系列で修正すべきとまでは思いませんが、2.0 で直る可能性はあるでしょうか。

IRC で話したら「それで普通」みたいな反応もありましたが、

  foo[0] = bar

はちゃんと :foo 、:bar の順に出ます。

--
Yusuke Endoh <mame@tsg.ne.jp>
=end
F24ff61beb80aa5f13371aa22a35619c?d=identicon&s=25 Yusuke Endoh (Guest)
on 2011-06-11 09:09
(Received via mailing list)
Issue #4443 has been updated by Yusuke Endoh.


http://redmine.ruby-lang.org/issues/4440
に matz の返事があります。

> 優先順位は高くありませんが、直すべきだと思います。
>
> とはいうものの、1.8のころからこうだったのですし、直すのが難しいのも確
> かなのですが。

確か redmine の更新直後で、インターフェイスの違いにハマってチケット登録に失敗してしまったのでした。

--
Yusuke Endoh <mame@tsg.ne.jp>
----------------------------------------
Bug #4443: odd evaluation order in a multiple assignment
http://redmine.ruby-lang.org/issues/4443

Author: Yusuke Endoh
Status: Assigned
Priority: Normal
Assignee: Yukihiro Matsumoto
Category:
Target version: 2.0
ruby -v: ruby 1.9.2p0 (2010-08-18 revision 29036) [i686-linux]


=begin
遠藤です。core に投げてしまったようなので登録し直し。

Ruby は左から右に評価が進むと信じていたのですが、多重代入で裏切られました。

  def foo
    p :foo
    []
  end
  def bar
    p :bar
  end

  x, foo[0] = bar, 0

bar より foo が左にあるので、:foo 、:bar の順に出力されることを期待するのですが、なんと :bar 、:foo になります。

具体的に何が困るかというと、例えば

  obj, obj.foo = obj.foo, obj

には swap
を期待するわけですが、そうなりません。こういうコードは実際に、木の回転などを実装するときにしばしば書きたくなります。この挙動に気がついたのも
splay tree を実装していたときでした。こんなの:

  t.left, t.left.right, t = t.left.right, t, t.left

1.9 系列で修正すべきとまでは思いませんが、2.0 で直る可能性はあるでしょうか。

IRC で話したら「それで普通」みたいな反応もありましたが、

  foo[0] = bar

はちゃんと :foo 、:bar の順に出ます。

--
Yusuke Endoh <mame@tsg.ne.jp>
=end
0ec4920185b657a03edf01fff96b4e9b?d=identicon&s=25 Yukihiro Matsumoto (Guest)
on 2011-06-11 15:28
(Received via mailing list)
$B$^$D$b$H(B $B$f$-$R$m$G$9(B

In message "Re: [ruby-dev:43724] [Ruby 1.9 - Bug #4443] odd evaluation
order in a multiple assignment"
    on Sat, 11 Jun 2011 15:49:30 +0900, Koichi Sasada
<redmine@ruby-lang.org> writes:

|$B$^$D$b$H$5$s!$$3$A$i$$$+$,$G$7$g$&$+!%(B
|$BD>$;$H8@$o$l$?$i;d$J$N$+$J$!!%(B

$B$9$G$K1sF#$5$s$,;XE&$7$F$/$@$5$$$^$7$?$,!"D>$;$k$b$N$J$iD>$7(B
$B$?$$$H;W$C$F$^$9!#(B
0ec4920185b657a03edf01fff96b4e9b?d=identicon&s=25 matz (Yukihiro Matsumoto) (Guest)
on 2012-04-10 11:35
(Received via mailing list)
Issue #4443 has been updated by matz (Yukihiro Matsumoto).


Cから受け継いだ代入の評価順が「おかしい」のが原因である(本来は a → b と表記すべきか)ことを考えると、
むしろ foo[0] = bar が :bar, :fooと動作するようにすべきでしょうか。

いや、単なる思いつきなのですが。

ちなみに今調べたら mruby は foo[0] = bar が :bar, :fooと動作しますね。

Matz.

----------------------------------------
Bug #4443: odd evaluation order in a multiple assignment
https://bugs.ruby-lang.org/issues/4443#change-25794

Author: mame (Yusuke Endoh)
Status: Assigned
Priority: Normal
Assignee: matz (Yukihiro Matsumoto)
Category:
Target version:
ruby -v: -


=begin
遠藤です。core に投げてしまったようなので登録し直し。

Ruby は左から右に評価が進むと信じていたのですが、多重代入で裏切られました。

  def foo
    p :foo
    []
  end
  def bar
    p :bar
  end

  x, foo[0] = bar, 0

bar より foo が左にあるので、:foo 、:bar の順に出力されることを期待するのですが、なんと :bar 、:foo になります。

具体的に何が困るかというと、例えば

  obj, obj.foo = obj.foo, obj

には swap
を期待するわけですが、そうなりません。こういうコードは実際に、木の回転などを実装するときにしばしば書きたくなります。この挙動に気がついたのも
splay tree を実装していたときでした。こんなの:

  t.left, t.left.right, t = t.left.right, t, t.left

1.9 系列で修正すべきとまでは思いませんが、2.0 で直る可能性はあるでしょうか。

IRC で話したら「それで普通」みたいな反応もありましたが、

  foo[0] = bar

はちゃんと :foo 、:bar の順に出ます。

--
Yusuke Endoh <mame@tsg.ne.jp>
=end
F24ff61beb80aa5f13371aa22a35619c?d=identicon&s=25 mame (Yusuke Endoh) (Guest)
on 2012-04-10 13:58
(Received via mailing list)
Issue #4443 has been updated by mame (Yusuke Endoh).


まあ、それはそれでいいかなと思います。
ちなみに ISO とかの標準的にはどうなってるんでしょう?

--
Yusuke Endoh <mame@tsg.ne.jp>
----------------------------------------
Bug #4443: odd evaluation order in a multiple assignment
https://bugs.ruby-lang.org/issues/4443#change-25802

Author: mame (Yusuke Endoh)
Status: Assigned
Priority: Normal
Assignee: matz (Yukihiro Matsumoto)
Category:
Target version:
ruby -v: -


=begin
遠藤です。core に投げてしまったようなので登録し直し。

Ruby は左から右に評価が進むと信じていたのですが、多重代入で裏切られました。

  def foo
    p :foo
    []
  end
  def bar
    p :bar
  end

  x, foo[0] = bar, 0

bar より foo が左にあるので、:foo 、:bar の順に出力されることを期待するのですが、なんと :bar 、:foo になります。

具体的に何が困るかというと、例えば

  obj, obj.foo = obj.foo, obj

には swap
を期待するわけですが、そうなりません。こういうコードは実際に、木の回転などを実装するときにしばしば書きたくなります。この挙動に気がついたのも
splay tree を実装していたときでした。こんなの:

  t.left, t.left.right, t = t.left.right, t, t.left

1.9 系列で修正すべきとまでは思いませんが、2.0 で直る可能性はあるでしょうか。

IRC で話したら「それで普通」みたいな反応もありましたが、

  foo[0] = bar

はちゃんと :foo 、:bar の順に出ます。

--
Yusuke Endoh <mame@tsg.ne.jp>
=end
0ec4920185b657a03edf01fff96b4e9b?d=identicon&s=25 matz (Yukihiro Matsumoto) (Guest)
on 2012-04-27 07:28
(Received via mailing list)
Issue #4443 has been updated by matz (Yukihiro Matsumoto).


手元にあるJIS x3017のドラフトを見ると現状の評価順(多重代入の場合には右辺が先)が記述してありますね(11.4.2.4)。
どうしたもんだか。
----------------------------------------
Bug #4443: odd evaluation order in a multiple assignment
https://bugs.ruby-lang.org/issues/4443#change-26244

Author: mame (Yusuke Endoh)
Status: Assigned
Priority: Normal
Assignee: matz (Yukihiro Matsumoto)
Category:
Target version:
ruby -v: -


=begin
遠藤です。core に投げてしまったようなので登録し直し。

Ruby は左から右に評価が進むと信じていたのですが、多重代入で裏切られました。

  def foo
    p :foo
    []
  end
  def bar
    p :bar
  end

  x, foo[0] = bar, 0

bar より foo が左にあるので、:foo 、:bar の順に出力されることを期待するのですが、なんと :bar 、:foo になります。

具体的に何が困るかというと、例えば

  obj, obj.foo = obj.foo, obj

には swap
を期待するわけですが、そうなりません。こういうコードは実際に、木の回転などを実装するときにしばしば書きたくなります。この挙動に気がついたのも
splay tree を実装していたときでした。こんなの:

  t.left, t.left.right, t = t.left.right, t, t.left

1.9 系列で修正すべきとまでは思いませんが、2.0 で直る可能性はあるでしょうか。

IRC で話したら「それで普通」みたいな反応もありましたが、

  foo[0] = bar

はちゃんと :foo 、:bar の順に出ます。

--
Yusuke Endoh <mame@tsg.ne.jp>
=end
C4e88907313843cf07f6d85ba8162120?d=identicon&s=25 ko1 (Koichi Sasada) (Guest)
on 2012-07-14 07:51
(Received via mailing list)
Issue #4443 has been updated by ko1 (Koichi Sasada).

Assignee changed from matz (Yukihiro Matsumoto) to ko1 (Koichi Sasada)


----------------------------------------
Bug #4443: odd evaluation order in a multiple assignment
https://bugs.ruby-lang.org/issues/4443#change-28032

Author: mame (Yusuke Endoh)
Status: Assigned
Priority: Normal
Assignee: ko1 (Koichi Sasada)
Category:
Target version:
ruby -v: -


=begin
遠藤です。core に投げてしまったようなので登録し直し。

Ruby は左から右に評価が進むと信じていたのですが、多重代入で裏切られました。

  def foo
    p :foo
    []
  end
  def bar
    p :bar
  end

  x, foo[0] = bar, 0

bar より foo が左にあるので、:foo 、:bar の順に出力されることを期待するのですが、なんと :bar 、:foo になります。

具体的に何が困るかというと、例えば

  obj, obj.foo = obj.foo, obj

には swap
を期待するわけですが、そうなりません。こういうコードは実際に、木の回転などを実装するときにしばしば書きたくなります。この挙動に気がついたのも
splay tree を実装していたときでした。こんなの:

  t.left, t.left.right, t = t.left.right, t, t.left

1.9 系列で修正すべきとまでは思いませんが、2.0 で直る可能性はあるでしょうか。

IRC で話したら「それで普通」みたいな反応もありましたが、

  foo[0] = bar

はちゃんと :foo 、:bar の順に出ます。

--
Yusuke Endoh <mame@tsg.ne.jp>
=end
6c06915d9aa00cd5c7d4acfb27cdd4e9?d=identicon&s=25 nahi (Hiroshi Nakamura) (Guest)
on 2012-10-25 22:34
(Received via mailing list)
Issue #4443 has been updated by nahi (Hiroshi Nakamura).

Status changed from Closed to Open

It looks to be closed by mistake.
----------------------------------------
Bug #4443: odd evaluation order in a multiple assignment
https://bugs.ruby-lang.org/issues/4443#change-31584

Author: mame (Yusuke Endoh)
Status: Open
Priority: Normal
Assignee: ko1 (Koichi Sasada)
Category:
Target version:
ruby -v: -


=begin
遠藤です。core に投げてしまったようなので登録し直し。

Ruby は左から右に評価が進むと信じていたのですが、多重代入で裏切られました。

  def foo
    p :foo
    []
  end
  def bar
    p :bar
  end

  x, foo[0] = bar, 0

bar より foo が左にあるので、:foo 、:bar の順に出力されることを期待するのですが、なんと :bar 、:foo になります。

具体的に何が困るかというと、例えば

  obj, obj.foo = obj.foo, obj

には swap
を期待するわけですが、そうなりません。こういうコードは実際に、木の回転などを実装するときにしばしば書きたくなります。この挙動に気がついたのも
splay tree を実装していたときでした。こんなの:

  t.left, t.left.right, t = t.left.right, t, t.left

1.9 系列で修正すべきとまでは思いませんが、2.0 で直る可能性はあるでしょうか。

IRC で話したら「それで普通」みたいな反応もありましたが、

  foo[0] = bar

はちゃんと :foo 、:bar の順に出ます。

--
Yusuke Endoh <mame@tsg.ne.jp>
=end
C4e88907313843cf07f6d85ba8162120?d=identicon&s=25 ko1 (Koichi Sasada) (Guest)
on 2012-10-30 01:09
(Received via mailing list)
Issue #4443 has been updated by ko1 (Koichi Sasada).

Category set to core
Target version set to next minor

...これバグなんだっけ? feature のような気もしますが.
2.0 には無理っぽいので,next minor にしておきます.
----------------------------------------
Bug #4443: odd evaluation order in a multiple assignment
https://bugs.ruby-lang.org/issues/4443#change-31953

Author: mame (Yusuke Endoh)
Status: Open
Priority: Normal
Assignee: ko1 (Koichi Sasada)
Category: core
Target version: next minor
ruby -v: -


=begin
遠藤です。core に投げてしまったようなので登録し直し。

Ruby は左から右に評価が進むと信じていたのですが、多重代入で裏切られました。

  def foo
    p :foo
    []
  end
  def bar
    p :bar
  end

  x, foo[0] = bar, 0

bar より foo が左にあるので、:foo 、:bar の順に出力されることを期待するのですが、なんと :bar 、:foo になります。

具体的に何が困るかというと、例えば

  obj, obj.foo = obj.foo, obj

には swap
を期待するわけですが、そうなりません。こういうコードは実際に、木の回転などを実装するときにしばしば書きたくなります。この挙動に気がついたのも
splay tree を実装していたときでした。こんなの:

  t.left, t.left.right, t = t.left.right, t, t.left

1.9 系列で修正すべきとまでは思いませんが、2.0 で直る可能性はあるでしょうか。

IRC で話したら「それで普通」みたいな反応もありましたが、

  foo[0] = bar

はちゃんと :foo 、:bar の順に出ます。

--
Yusuke Endoh <mame@tsg.ne.jp>
=end
This topic is locked and can not be replied to.