From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Original-To: poffice@blade.nagaokaut.ac.jp Delivered-To: poffice@blade.nagaokaut.ac.jp Received: from kankan.nagaokaut.ac.jp (kankan.nagaokaut.ac.jp [133.44.2.24]) by blade.nagaokaut.ac.jp (Postfix) with ESMTP id 2A99E1F0371 for ; Tue, 8 Jan 2008 14:07:47 +0900 (JST) Received: from funfun2.nagaokaut.ac.jp (funfun2.nagaokaut.ac.jp [133.44.2.27]) by kankan.nagaokaut.ac.jp (Postfix) with ESMTP id 3C29B9399 for ; Tue, 8 Jan 2008 14:06:26 +0900 (JST) Received: from localhost (localhost.nagaokaut.ac.jp [127.0.0.1]) by funfun2.nagaokaut.ac.jp (Postfix) with ESMTP id 003458FC28 for ; Tue, 8 Jan 2008 14:06:29 +0900 (JST) X-Virus-Scanned: amavisd-new at funfun2.nagaokaut.ac.jp Received: from funfun2.nagaokaut.ac.jp ([127.0.0.1]) by localhost (funfun2.nagaokaut.ac.jp [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id iSuADPZzXzRM for ; Tue, 8 Jan 2008 14:06:28 +0900 (JST) Received: from voscc.nagaokaut.ac.jp (voscc.nagaokaut.ac.jp [133.44.1.100]) by funfun2.nagaokaut.ac.jp (Postfix) with ESMTP id CF45D8FC1B for ; Tue, 8 Jan 2008 14:06:28 +0900 (JST) Received: from carbon.ruby-lang.org (carbon.ruby-lang.org [221.186.184.68]) by voscc.nagaokaut.ac.jp (Postfix) with ESMTP id 25500630041 for ; Tue, 8 Jan 2008 14:06:29 +0900 (JST) Received: from beryllium.ruby-lang.org (beryllium.ruby-lang.org [127.0.0.1]) by carbon.ruby-lang.org (Postfix) with ESMTP id 90B563C21EB7F; Tue, 8 Jan 2008 14:06:16 +0900 (JST) Received: from parasect1.netlab.jp (parasect1.netlab.jp [210.251.121.9]) by carbon.ruby-lang.org (Postfix) with ESMTP id 79B643C21ED6B for ; Tue, 8 Jan 2008 14:06:14 +0900 (JST) Received: from x61.netlab.jp (softbank221079075121.bbtec.net [221.79.75.121]) by parasect1.netlab.jp (Postfix) with ESMTP id 0559C1C2C49F for ; Tue, 8 Jan 2008 14:06:22 +0900 (JST) Received: from matz by x61.netlab.jp with local (Exim 4.68) (envelope-from ) id 1JC6fO-0002Dl-VR for ruby-core@ruby-lang.org; Tue, 08 Jan 2008 14:06:22 +0900 Delivered-To: ruby-core@ruby-lang.org Date: Tue, 8 Jan 2008 14:06:14 +0900 Posted: Tue, 08 Jan 2008 14:06:22 +0900 From: Yukihiro Matsumoto Reply-To: ruby-core@ruby-lang.org Subject: Re: Enumerable#zip Needs Love To: ruby-core@ruby-lang.org Message-Id: In-Reply-To: <44A62B29-274B-43EC-955C-91DD61F47B3E@grayproductions.net> X-ML-Name: ruby-core X-Mail-Count: 14837 X-MLServer: fml [fml 4.0.3 release (20011202/4.0.3)]; post only (only members can post) X-ML-Info: If you have a question, send e-mail with the body "help" (without quotes) to the address ruby-core-ctl@ruby-lang.org; help= User-Agent: SEMI/1.14.6 (Maruoka) FLIM/1.14.9 (=?ISO-8859-4?Q?Goj=F2?=) APEL/10.7 Emacs/22.1 (i486-pc-linux-gnu) MULE/5.0 (SAKAKI) X-Spam-Checker-Version: SpamAssassin 3.1.7 (2006-10-05) on carbon.ruby-lang.org X-Spam-Level: X-Spam-Status: No, score=-5.1 required=7.0 tests=AWL,BAYES_00,BBTEC, CONTENT_TYPE_PRESENT,EXIM_ERRWARN,FAKEDWORD_VERTICALLINE, FORGED_RCVD_HELO autolearn=disabled version=3.1.7 X-Original-To: ruby-core@ruby-lang.org Mime-Version: 1.0 (generated by SEMI 1.14.6 - "Maruoka") Content-Type: text/plain; charset=US-ASCII Precedence: bulk List-Id: ruby-core.ruby-lang.org List-Software: fml [fml 4.0.3 release (20011202/4.0.3)] List-Post: List-Owner: List-Help: List-Unsubscribe: Hi, In message "Re: Enumerable#zip Needs Love" on Tue, 8 Jan 2008 13:50:09 +0900, James Gray writes: |> (a) stopping at the shortest |* With the 1.8 system, we easily can have it both ways. We can find |the bigger group and lead with that to save all data, or find the |shorter group and lead with it to trim data. |* Under 1.9 we lose data by default and it's challenging to save it |since all groups must be expanded to the same length. Points taken. |> (b) return value |* An Array is a super set of Enumerable, so we gain more options |without losing anything. Although an array is a Enumerable, and implements every methods in Enumerable, I still hesitate to call it "super set", just because it introduces several restriction of Enumerable, for example non infinity length. This is typical super set/sub set issue. But using zip to create zipped array is certainly important use-case, and consistency is not the primary goal of Ruby's design. |* It seems to break a fair bit of 1.8 code. I can name three |libraries affected by the change off the top of my head. |* Performance seems like another good reason to do this, since you |said it would speed things up. Points taken. |> But use-case is more important than theoretical rationale. There are |> several options we can take: |> |> (3) hardest way - (2) + honoring length of the receiver |> |> I am not sure how to implement it yet. | |I don't understand. We had this in 1.8. Can we not go back to that |code? The internal was totally re-written in 1.9 using fiber, but that's OK. It's our matter. In fact, I figured out how to do it while waiting for your reply. And actually implemented it already. See attached patch. matz. diff --git a/enum.c b/enum.c index 04fade3..bf18e27 100644 --- a/enum.c +++ b/enum.c @@ -1347,6 +1347,36 @@ enum_each_with_index(int argc, VALUE *argv, VALUE obj) static VALUE +zip_a(VALUE val, NODE *memo, int argc, VALUE *argv) +{ + volatile VALUE result = memo->u1.value; + volatile VALUE args = memo->u2.value; + volatile VALUE tmp; + long idx = memo->u3.cnt++; + int i; + + tmp = rb_ary_new2(RARRAY_LEN(args) + 1); + rb_ary_store(tmp, 0, val); + for (i=0; iu1.value; @@ -1357,8 +1387,20 @@ zip_i(VALUE val, NODE *memo, int argc, VALUE *argv) tmp = rb_ary_new2(RARRAY_LEN(args) + 1); rb_ary_store(tmp, 0, enum_values_pack(argc, argv)); for (i=0; iu3.value, id_each, 0, 0, zip_i, (VALUE)memo); -} - /* * call-seq: * enum.zip(arg, ...) => enumerator @@ -1400,19 +1436,30 @@ zip_b(NODE *memo) static VALUE enum_zip(int argc, VALUE *argv, VALUE obj) { - int i; - VALUE result; + int i, block; + ID conv; NODE *memo; - for (i=0; iu1.value; } - RETURN_ENUMERATOR(obj, argc, argv); - result = rb_block_given_p() ? Qnil : rb_ary_new(); - memo = rb_node_newnode(NODE_MEMO, result, rb_ary_new4(argc, argv), obj); - rb_rescue2(zip_b, (VALUE)memo, 0, 0, rb_eStopIteration, (VALUE)0); + else { + conv = rb_intern("to_enum"); + for (i=0; i