なかだです。

At Fri, 26 Sep 2003 13:16:59 +0900,
Nobuyoshi-Nakada wrote:
> *listも逆転します。
> 
> $ ./ruby -ve 'def m(*args) end; m((p 0), (p 1), *(p 2), &(p 3))'
> ruby 1.8.0 (2003-09-25) [i686-linux]
> 3
> 2
> 0
> 1

これもMATCH2と同じく、逆転ではなくて不定でした。

> あと、/#{p 1;"a"}/ =~ (p 2) のような左辺が動的なRegexpのマッチ
> は、評価順序が不定です。

この二つはこれでいいと思います。


Index: eval.c =================================================================== RCS file: /cvs/ruby/src/ruby/eval.c,v retrieving revision 1.546 diff -u -2 -p -r1.546 eval.c --- eval.c 2 Oct 2003 08:24:45 -0000 1.546 +++ eval.c 3 Oct 2003 04:27:39 -0000 @@ -2478,6 +2478,9 @@ rb_eval(self, n) /* nodes for speed-up(literal match) */ case NODE_MATCH2: - result = rb_reg_match(rb_eval(self,node->nd_recv), - rb_eval(self,node->nd_value)); + { + VALUE l = rb_eval(self,node->nd_recv); + VALUE r = rb_eval(self,node->nd_value); + result = rb_reg_match(l, r); + } break; @@ -2930,11 +2933,17 @@ rb_eval(self, n) case NODE_ARGSCAT: - result = rb_ary_concat(rb_eval(self, node->nd_head), - splat_value(rb_eval(self, node->nd_body))); + { + VALUE args = rb_eval(self, node->nd_head); + result = rb_ary_concat(args, + splat_value(rb_eval(self, node->nd_body))); + } break; case NODE_ARGSPUSH: - result = rb_ary_push(rb_ary_dup(rb_eval(self, node->nd_head)), - rb_eval(self, node->nd_body)); + { + VALUE args = rb_ary_dup(rb_eval(self, node->nd_head)); + result = rb_ary_push(args, + rb_eval(self, node->nd_body)); + } break;
-- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦