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

Issue #4443 has been reported by Yusuke E…


Bug #4443: odd evaluation order in a multiple assignment

Author: Yusuke E.
Status: Open
Priority: Normal
Assignee: Yukihiro M.
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 E. [email protected]

Issue #4443 has been updated by Koichi Sasada.

まつもとさん,こちらいかがでしょうか.
直せと言われたら私なのかなぁ.

Bug #4443: odd evaluation order in a multiple assignment

Author: Yusuke E.
Status: Assigned
Priority: Normal
Assignee: Yukihiro M.
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 E. [email protected]
=end

Issue #4443 has been updated by Yusuke E…

に matz の返事があります。

優先順位は高くありませんが、直すべきだと思います。

とはいうものの、1.8のころからこうだったのですし、直すのが難しいのも確
かなのですが。

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


Yusuke E. [email protected]

Bug #4443: odd evaluation order in a multiple assignment

Author: Yusuke E.
Status: Assigned
Priority: Normal
Assignee: Yukihiro M.
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 E. [email protected]
=end

$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
[email protected] 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

Issue #4443 has been updated by mame (Yusuke E.).

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


Yusuke E. [email protected]

Bug #4443: odd evaluation order in a multiple assignment

Author: mame (Yusuke E.)
Status: Assigned
Priority: Normal
Assignee: matz (Yukihiro M.)
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 E. [email protected]
=end

Issue #4443 has been updated by matz (Yukihiro M.).

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

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

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

Matz.


Bug #4443: odd evaluation order in a multiple assignment

Author: mame (Yusuke E.)
Status: Assigned
Priority: Normal
Assignee: matz (Yukihiro M.)
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 E. [email protected]
=end

Issue #4443 has been updated by ko1 (Koichi Sasada).

Assignee changed from matz (Yukihiro M.) to ko1 (Koichi Sasada)


Bug #4443: odd evaluation order in a multiple assignment

Author: mame (Yusuke E.)
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 E. [email protected]
=end

Issue #4443 has been updated by nahi (Hiroshi N.).

Status changed from Closed to Open

It looks to be closed by mistake.

Bug #4443: odd evaluation order in a multiple assignment

Author: mame (Yusuke E.)
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 E. [email protected]
=end

Issue #4443 has been updated by matz (Yukihiro M.).

手元にあるJIS x3017のドラフトを見ると現状の評価順(多重代入の場合には右辺が先)が記述してありますね(11.4.2.4)。
どうしたもんだか。

Bug #4443: odd evaluation order in a multiple assignment

Author: mame (Yusuke E.)
Status: Assigned
Priority: Normal
Assignee: matz (Yukihiro M.)
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 E. [email protected]
=end

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

Author: mame (Yusuke E.)
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 E. [email protected]
=end