[前][次][番号順一覧][スレッド一覧]

ruby-changes:22992

From: shugo <ko1@a...>
Date: Thu, 15 Mar 2012 18:25:50 +0900 (JST)
Subject: [ruby-changes:22992] shugo:r35041 (trunk): * enumerator.c (lazy_zip, lazy_cycle): Enumerator::Lazy#{zip,cycle}

shugo	2012-03-15 18:25:03 +0900 (Thu, 15 Mar 2012)

  New Revision: 35041

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=35041

  Log:
    * enumerator.c (lazy_zip, lazy_cycle): Enumerator::Lazy#{zip,cycle}
      should be eager when a block is given, to be consistent with
      Enumerable#{zip,cycle}.

  Modified files:
    trunk/ChangeLog
    trunk/enumerator.c
    trunk/test/ruby/test_lazy_enumerator.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 35040)
+++ ChangeLog	(revision 35041)
@@ -1,3 +1,9 @@
+Thu Mar 15 18:19:53 2012  Shugo Maeda  <shugo@r...>
+
+	* enumerator.c (lazy_zip, lazy_cycle): Enumerator::Lazy#{zip,cycle}
+	  should be eager when a block is given, to be consistent with
+	  Enumerable#{zip,cycle}.
+
 Thu Mar 15 17:45:27 2012  Shugo Maeda  <shugo@r...>
 
 	* enumerator.c (InitVM_Enumerator): renamed Enumerable::Lazy to
Index: enumerator.c
===================================================================
--- enumerator.c	(revision 35040)
+++ enumerator.c	(revision 35041)
@@ -1374,24 +1374,6 @@
 }
 
 static VALUE
-lazy_zip_func_i(VALUE val, VALUE arg, int argc, VALUE *argv)
-{
-    VALUE yielder, ary, v, result;
-    long i;
-
-    yielder = argv[0];
-    ary = rb_ary_new2(RARRAY_LEN(arg) + 1);
-    rb_ary_push(ary, argv[1]);
-    for (i = 0; i < RARRAY_LEN(arg); i++) {
-	v = rb_funcall(RARRAY_PTR(arg)[i], id_next, 0);
-	rb_ary_push(ary, v);
-    }
-    result = rb_yield(ary);
-    rb_funcall(yielder, id_yield, 1, result);
-    return Qnil;
-}
-
-static VALUE
 lazy_zip_func(VALUE val, VALUE arg, int argc, VALUE *argv)
 {
     VALUE yielder, ary, v;
@@ -1414,14 +1396,15 @@
     VALUE ary;
     int i;
 
+    if (rb_block_given_p()) {
+	return rb_call_super(argc, argv);
+    }
     ary = rb_ary_new2(argc);
     for (i = 0; i < argc; i++) {
 	rb_ary_push(ary, rb_funcall(argv[i], id_lazy, 0));
     }
 
-    return rb_block_call(rb_cLazy, id_new, 1, &obj,
-			 rb_block_given_p() ? lazy_zip_func_i :  lazy_zip_func,
-			 ary);
+    return rb_block_call(rb_cLazy, id_new, 1, &obj, lazy_zip_func, ary);
 }
 
 static VALUE
@@ -1528,6 +1511,9 @@
     VALUE args;
     int len = rb_long2int((long)argc + 2);
 
+    if (rb_block_given_p()) {
+	return rb_call_super(argc, argv);
+    }
     args = rb_ary_tmp_new(len);
     rb_ary_push(args, obj);
     rb_ary_push(args, sym_cycle);
@@ -1535,8 +1521,7 @@
 	rb_ary_cat(args, argv, argc);
     }
     return rb_block_call(rb_cLazy, id_new, len, RARRAY_PTR(args),
-			 rb_block_given_p() ? lazy_map_func : lazy_cycle_func,
-			 args /* prevent from GC */);
+			 lazy_cycle_func, args /* prevent from GC */);
 }
 
 static VALUE
Index: test/ruby/test_lazy_enumerator.rb
===================================================================
--- test/ruby/test_lazy_enumerator.rb	(revision 35040)
+++ test/ruby/test_lazy_enumerator.rb	(revision 35041)
@@ -139,9 +139,12 @@
   end
 
   def test_zip_with_block
+    # zip should be eager when a block is given
     a = Step.new(1..3)
-    assert_equal(["a", 1], a.lazy.zip("a".."c") {|x, y| [y, x]}.first)
-    assert_equal(1, a.current)
+    ary = []
+    assert_equal(nil, a.lazy.zip("a".."c") {|x, y| ary << [x, y]})
+    assert_equal(a.zip("a".."c"), ary)
+    assert_equal(3, a.current)
   end
 
   def test_take
@@ -190,10 +193,17 @@
     assert_equal(3, a.current)
     assert_equal("1", a.lazy.cycle(2).map(&:to_s).first)
     assert_equal(1, a.current)
-    assert_equal("1", a.lazy.cycle(2, &:to_s).first)
-    assert_equal(1, a.current)
   end
 
+  def test_cycle_with_block
+    # cycle should be eager when a block is given
+    a = Step.new(1..3)
+    ary = []
+    assert_equal(nil, a.lazy.cycle(2) {|i| ary << i})
+    assert_equal(a.cycle(2).to_a, ary)
+    assert_equal(3, a.current)
+  end
+
   def test_force
     assert_equal([1, 2, 3], (1..Float::INFINITY).lazy.take(3).force)
   end

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]