From: nobu.nakada@... Date: 2003-03-08T21:13:34+09:00 Subject: [ruby-dev:19770] Re: (1.8.0-preview2) Proc#call なかだです。 At Fri, 7 Mar 2003 10:29:59 +0900, Yukihiro Matsumoto wrote: > | f2 = lambda { |r,*l| p r,l } > | a1 = [1] > | f2.call([], *a1) # A > | f2.call([[], *a1]) # B > | > |[ruby-dev:19752]はブロックの引数が一つのときだけ展開するように > |なってるので、AとBのどちらもr=[], l=[1]になりますが。 > > 「r,*l = [], *[1]」、「r,*l = [[], *[1]]」ともにr=[],l=[1]な > ので、それが正しいと思います。 Proc#yieldがうまくいってないような気がします。 $ ruby -v ' f1 = lambda {|r,| p r} a0 = [] f1.yield([], *a0) ' ruby 1.8.0 (2003-03-08) [i686-linux] nil これも[]になるべきかと思うんですが。 Index: eval.c =================================================================== RCS file: //sharui/cvs/ruby/src/ruby/eval.c,v retrieving revision 1.407 diff -u -2 -p -r1.407 eval.c --- eval.c 8 Mar 2003 02:31:02 -0000 1.407 +++ eval.c 8 Mar 2003 11:15:57 -0000 @@ -3899,5 +3899,5 @@ rb_yield_0(val, self, klass, pcall, aval if ((state = EXEC_TAG()) == 0) { if (block->var == (NODE*)1) { - if (pcall && RARRAY(val)->len != 0) { + if (RTEST(pcall) && RARRAY(val)->len != 0) { rb_raise(rb_eArgError, "wrong number of arguments (%ld for 0)", RARRAY(val)->len); @@ -4054,5 +4054,5 @@ massign(self, node, val, pcall) tmp = val; } - if (pcall && list) goto arg_error; + if (RTEST(pcall) && list) goto arg_error; if (node->nd_args) { if (node->nd_args == (NODE*)-1) { @@ -4066,5 +4066,5 @@ massign(self, node, val, pcall) } } - else if (pcall && i < len) { + else if (RTEST(pcall) && i < len) { goto arg_error; } @@ -6744,5 +6744,5 @@ proc_yield(proc, args) VALUE proc, args; /* OK */ { - return proc_invoke(proc, args, Qfalse, Qundef); + return proc_invoke(proc, args, Qnil, Qundef); } -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦