[#98950] Strange behaviour of Strings in Range — Michael Neumann <mneumann@...>

Hi,

24 messages 2004/05/01

[#98975] Why no Proc##[]=() ? Why no Proc##replace() ? — Jean-Hugues ROBERT <jean_hugues_robert@...>

Hi,

15 messages 2004/05/01
[#98983] Re: Why no Proc##[]=() ? Why no Proc##replace() ? — Dan Doel <djd15@...> 2004/05/01

I'm not sure what your proposal means.

[#98997] Re: Why no Proc##[]=() ? Why no Proc##replace() ? — Jean-Hugues ROBERT <jean_hugues_robert@...> 2004/05/02

About class Proc; def []=(*args); self[*args] end end and the value of

[#98980] Ruby Newbie (ooh, that rhymes!) - When do I use do/end, when {}? — glenn_m_smith@... (Glenn)

Hello all

23 messages 2004/05/01

[#99105] What do you use Ruby for? — glenn_m_smith@... (Glenn)

OK, the more I read about Ruby (currently on page 29 of the FAQ,

25 messages 2004/05/03

[#99119] YAML vs. Marshal — dejaspam@... (Bill Atkins)

Is there any reason to use Marshal instead of YAML? Is there anything

21 messages 2004/05/03
[#99121] Re: YAML vs. Marshal — Joel VanderWerf <vjoel@...> 2004/05/03

Bill Atkins wrote:

[#99191] Re: YAML vs. Marshal — why the lucky stiff <ruby-talk@...> 2004/05/04

Joel VanderWerf wrote:

[#99192] Re: YAML vs. Marshal — Hal Fulton <hal9000@...> 2004/05/04

why the lucky stiff wrote:

[#99204] What so special about PostgreSQL and other RDBMS? — "Sarah Tanembaum" <sarah.tanembaum@...>

Beside its an opensource and supported by community, what's the fundamental

96 messages 2004/05/04

[#99270] Is Ruby Top 1 of Programming Languages that are Loved? — "Park Heesob" <phasis68@...>

Hi all,

66 messages 2004/05/05
[#99333] Re: [OT]Is Ruby Top 1 of Programming Languages that are Loved? — ptkwt@... (Phil Tomson) 2004/05/06

In article <83173408.0405051506.5db85fe6@posting.google.com>,

[#99358] Re: [OT]Is Ruby Top 1 of Programming Languages that are Loved? — Dick Davies <rasputnik@...> 2004/05/06

* Phil Tomson <ptkwt@aracnet.com> [0554 02:54]:

[#99378] Re: [OT]Is Ruby Top 1 of Programming Languages that are Loved? — "Ara.T.Howard" <ahoward@...> 2004/05/06

On Thu, 6 May 2004, Dick Davies wrote:

[#99326] RAA error - can't dup NilClass — Simon Strandgaard <neoneye@...>

When I try to enter my project page

15 messages 2004/05/06
[#99327] Re: RAA error - can't dup NilClass — "NAKAMURA, Hiroshi" <nahi@...> 2004/05/06

Hi,

[#99328] Re: RAA error - can't dup NilClass — "NAKAMURA, Hiroshi" <nahi@...> 2004/05/06

Hi, again,

[#99332] miniruby.exe & statically linked ruby.exe (Windows) — ptkwt@... (Phil Tomson)

I've been trying to build a statically linked ruby.exe on windows using

12 messages 2004/05/06

[#99399] DRb Connection Closed Error?!?!?!? — "Ken Hilton" <kenosis@...>

Greetings,

14 messages 2004/05/06

[#99438] What is Borges? — dejaspam@... (Bill Atkins)

Can someone please explain to me what Borges does? Its home page

41 messages 2004/05/07
[#99482] Re: What is Borges? — Dick Davies <rasputnik@...> 2004/05/07

* Bill Atkins <dejaspam@batkins.com> [0534 01:34]:

[#99530] Re: What is Borges? — Julian Fitzell <julian@...4.com> 2004/05/07

Dick Davies wrote:

[#99534] Re: What is Borges? — Carl Youngblood <carl@...> 2004/05/07

[#99527] Ruby Installer for Windows: use of Win32OLE bug causes crash — Jos Backus <jos@...>

This is with the latest Ruby Installer for Windows, 181-13-rc2.

11 messages 2004/05/07

[#99583] Ruby Installer for Windows 1.8.1-13 final — "Curt Hibbs" <curt@...>

The Ruby Installer 1.8.1-13 (final) for Windows has been released and

62 messages 2004/05/08
[#99643] Why Ruby? -- A Resource for Promoting Ruby — "Curt Hibbs" <curt@...> 2004/05/09

I'm pleased to announce the kickoff of RubyForge project called "Why Ruby?"

[#104934] Ruby Installer for Windows 1.8.2-14 Release Candidate — "Curt Hibbs" <curt@...> 2004/06/30

I have uploaded a release candidate for Ruby Installer that was built using

[#104952] **RC2** Ruby Installer for Windows 1.8.2-14 Release Candidate — "Curt Hibbs" <curt@...> 2004/07/01

The original release candidate that I posted earlier today did not include

[#105519] Re: [ANN] **RC2** Ruby Installer for Windows 1.8.2-14 Release Candidate — Lothar Scholz <mailinglists@...> 2004/07/07

Hello Curt,

[#105546] Re: [ANN] **RC2** Ruby Installer for Windows 1.8.2-14 Release Candidate — Hidetoshi NAGAI <nagai@...> 2004/07/08

Hi,

[#105550] Re: [ANN] **RC2** Ruby Installer for Windows 1.8.2-14 Release Candidate — nobu.nokada@... 2004/07/08

Hi,

[#99597] How to get the last 5 elements of an array? — Gavin Sinclair <gsinclair@...>

Hi,

20 messages 2004/05/08

[#99680] rubygarden homepage hacks — Simon Strandgaard <neoneye@...>

On daily basis the homepage at rubygarden is being edited.

19 messages 2004/05/09

[#99734] in search of a compelling reason to use ruby.... — Ryan Paul <segphault@...>

i'm a python programmer, and I have recently been hearing a lot about

28 messages 2004/05/10

[#99764] safe eval? — "Ara.T.Howard" <Ara.T.Howard@...>

20 messages 2004/05/10
[#99773] Re: safe eval? — Florian Gross <flgr@...> 2004/05/10

Ara.T.Howard wrote:

[#99834] Re: safe eval? — ts <decoux@...> 2004/05/11

>>>>> "F" == Florian Gross <flgr@ccan.de> writes:

[#99854] Proposal: Object#send(nil) -> self — Gavin Sinclair <gsinclair@...>

A quick one. I see some sense in Object#send accepting 'nil' as the

21 messages 2004/05/11

[#99879] Strange regexp behaviour in gsub — Kristof Bastiaensen <kristof@...>

Hi,

15 messages 2004/05/11

[#99945] Recommendations (Ruby making my head swim) — Mike Rhodes <rhodes553@...>

I recently bought "Programming Ruby" and set out to learn the language

13 messages 2004/05/12

[#99966] Major Addition Bug? — "Sean O'Dell" <sean@...>

Doing this:

57 messages 2004/05/12
[#99967] Re: Major Addition Bug? — ts <decoux@...> 2004/05/12

>>>>> "S" == Sean O'Dell <sean@celsoft.com> writes:

[#99970] Re: Major Addition Bug? — "Sean O'Dell" <sean@...> 2004/05/12

On Wednesday 12 May 2004 09:53, ts wrote:

[#100032] are there any ruby IDEs? — Ryan Paul <segphault@...>

I use vim most of the time, but i'm curious if there are any

35 messages 2004/05/12

[#100093] How to make combinations of an array to produce all possible expressions? — Erik Terpstra <erik@...>

I have an array 'conds', which contains some sub-expressions for an

11 messages 2004/05/13

[#100136] Ruby's Best -- Please Help — "Curt Hibbs" <curt@...>

On the "Why Ruby?" project wiki (http://whyruby.rubyforge.org/), I am trying

23 messages 2004/05/13
[#100284] Please revisit Ruby's Best and vote for additions — "Curt Hibbs" <curt@...> 2004/05/14

If you were an early visitor to:

[#100137] First Presentation Posted to Why Ruby! — "Curt Hibbs" <curt@...>

Assaph Mehr just posted the first presentation to Why Ruby

22 messages 2004/05/13
[#100172] Presenting a more unified front (Ruby webring?) — ptkwt@... (Phil Tomson) 2004/05/13

In article <EAENKKNOJPMNCDMLDOMLKEHHEFAA.curt@hibbs.com>,

[#100182] C++ Exception compatibility idea — Asfand Yar Qazi <im_not_giving_it_here@..._hate_spam.com>

Hi,

26 messages 2004/05/13
[#100206] Rite implementation in C++? (Objective C?) — ptkwt@... (Phil Tomson) 2004/05/13

In article <40A3E539.2010204@hypermetrics.com>,

[#100193] subclasses of string as hash keys — Matthias Georgi <matti_g@...>

15 messages 2004/05/13

[#100273] Regexp Error? — "Robert Klemme" <bob.news@...>

What's wrong here?

16 messages 2004/05/14

[#100295] Re: Regexp Error? — Michael Campbell <michael_s_campbell@...>

ts wrote:

15 messages 2004/05/14

[#100325] Re: Please revisit Ruby's Best and vote for additions — "Curt Hibbs" <curt@...>

James Britt wrote:

12 messages 2004/05/14

[#100395] Need Help Selecting a GUI — dejaspam@... (Bill Atkins)

As anyone can tell by looking at the topics of my recent posts, I'm

18 messages 2004/05/15

[#100461] Ruby on Rails — Matt Lawrence <matt@...>

Very neat presentation, it kept me up way too late last night watching it.

24 messages 2004/05/16

[#100511] How to duck type? - the psychology of static typing in Ruby — Tim Bates <tim@...>

Hi all,

83 messages 2004/05/17
[#100525] Re: How to duck type? - the psychology of static typing in Ruby — "SER" <ser@...> 2004/05/17

Broken record time:

[#100791] Re: How to duck type? - the psychology of static typing in Ruby — Marek Janukowicz <childNOSPAM@...17.ds.pwr.wroc.pl> 2004/05/19

On Thu, 20 May 2004 03:43:22 +0900, Dave Thomas wrote:

[#100613] FoX: removing widgets — Yuri Leikind <y.leikind@...>

Hello all,

16 messages 2004/05/18
[#100670] Re: FoX: removing widgets — Lyle Johnson <lyle@...> 2004/05/18

Yuri Leikind wrote:

[#100629] Newbie installation problem: libraries? — Paul Emmons <pemmons@...>

I have recently installed ruby-1.8.1 on my Mandrake Linux system.

11 messages 2004/05/18

[#100649] Windows desktop app w/ simple db; how? — "Kirk Haines" <khaines@...>

Imagine that you had a very simple web based application. It queries some

12 messages 2004/05/18

[#100653] Zero is true ... whoda thunk? — "Richard Lionheart" <NoOne@...>

Hi,

29 messages 2004/05/18
[#100655] Re: Zero is true ... whoda thunk? — Mark Sparshatt <msparshatt@...> 2004/05/18

Richard Lionheart wrote:

[#100682] Re: Zero is true ... whoda thunk? — Chris Pine <cpine@...> 2004/05/19

On Wed, 19 May 2004 06:34:54 +0900, Mark Sparshatt wrote:

[#100691] Re: Zero is true ... whoda thunk? — David Naseby <david.naseby@...>

>-----Original Message-----

14 messages 2004/05/19

[#100721] irb or xterm crash with UTF-8 — Simon Strandgaard <neoneye@...>

server> irb

15 messages 2004/05/19

[#100839] Where to download FXRuby library; where to put it; RUBYLIB, RUBYPATH env. vars — "Richard Lionheart" <NoOne@...>

Hi,

14 messages 2004/05/20

[#100862] Ruby's builtin Datastructures — Brian Schroeder <spam0504@...>

Hello all,

13 messages 2004/05/20

[#101071] Concerning version numbers... — Hal Fulton <hal9000@...>

A few people in recent weeks have been bemoaning the fact that software

15 messages 2004/05/22

[#101110] Ruby for educational purposes and localization — Laurent Julliard <laurent__no__@__spam__moldus.org>

All,

10 messages 2004/05/23

[#101165] make faster Richards benchmark — dlissett0@... (Duncan Lissett)

I'd appreciate any suggestions on how to make a faster Ruby

15 messages 2004/05/24

[#101226] Concerning package names — djberg96@... (Daniel Berger)

All,

13 messages 2004/05/24

[#101292] Numeric#of — "Ara.T.Howard" <ahoward@...>

53 messages 2004/05/25

[#101329] separating ruby-talk from comp.lang.ruby? — David Alan Black <dblack@...>

Hi --

65 messages 2004/05/25
[#101388] Re: separating ruby-talk from comp.lang.ruby? — ptkwt@... (Phil Tomson) 2004/05/25

In article <m3brkcda7g.fsf@wobblini.net>,

[#101391] Re: separating ruby-talk from comp.lang.ruby? — "David A. Black" <dblack@...> 2004/05/25

Hi --

[#101360] ruby-dev summary 23459-23562 — Minero Aoki <aamine@...>

Hi all,

30 messages 2004/05/25
[#101395] Re: ruby-dev summary 23459-23562 — Florian Gross <flgr@...> 2004/05/25

Minero Aoki wrote:

[#101369] defining condititions — Florian Weber <csshsh@...>

hi!

18 messages 2004/05/25

[#101522] WEBrick and FastCGI response — Jim Freeze <jim@...>

Reply-To:

15 messages 2004/05/27

[#101560] Re: separating ruby-talk from comp.lang.ruby? — "Mills Thomas (app1tam)" <app1tam@...>

Here, here, hear, hear. No NNTP here.

41 messages 2004/05/27
[#101565] Re: separating ruby-talk from comp.lang.ruby? — "David A. Black" <dblack@...> 2004/05/27

Hi --

[#101569] Re: separating ruby-talk from comp.lang.ruby? — Dave Thomas <dave@...> 2004/05/27

[#101571] Re: separating ruby-talk from comp.lang.ruby? — "David A. Black" <dblack@...> 2004/05/27

Hi --

[#101616] Re: separating ruby-talk from comp.lang.ruby? — "David A. Black" <dblack@...> 2004/05/28

Hi --

[#101686] Re: separating ruby-talk from comp.lang.ruby? — Dave Thomas <dave@...> 2004/05/28

[#101890] Re: separating ruby-talk from comp.lang.ruby? — "David A. Black" <dblack@...> 2004/05/31

Sorry everyone, testing again.... small meaningless tweak to

[#101674] Andreas' practical language comparison — "Georgy" <no.mail@...>

Hi all!

13 messages 2004/05/28

[#101745] Test::Unit: assert_follows_spec() (or something like that) — David Garamond <lists@...6.isreserved.com>

For deterministic functions/methods, the same set of inputs should

20 messages 2004/05/29

[#101823] gsub!, replace with \' — Patrick Gundlach <clr1.10.randomuser@...>

Dear Ruby-hackers,

14 messages 2004/05/30

[#101830] Behavior of application changes when adding non-relevant puts — felix.nawothnig@... (Felix Nawothnig)

Hi.

12 messages 2004/05/30

[#101853] mysql-ruby — Paul Vudmaska <paul@...>

%$@#%$ i know i've abused this list with more questions than answers but

14 messages 2004/05/31

[#101855] elegant way to say "try this thing, one at a time, until condition is met" — David Garamond <lists@...6.isreserved.com>

Example: I need to unmount /usr and /usr2, but currently I can't because

23 messages 2004/05/31

[#101899] RMagick available on Windows — Tim Hunter <cyclists@...>

Thanks to Kaspar Schiess, RMagick for Windows is now available at

13 messages 2004/05/31

Re: RCR: More enumerator functionality

From: nobu.nokada@...
Date: 2004-05-19 02:47:30 UTC
List: ruby-talk #100684
Hi,

At Mon, 17 May 2004 20:34:05 +0900,
Kristof Bastiaensen wrote in [ruby-talk:100500]:
> 5.enum_filter(:times){ |i| i[0] == 0 }.collect
> => [2, 4]
  => [0, 2, 4]

Isn't it?

> (2)* Enumerable::Enumerator takes a optional block
> 
> powers = 4.enum_for(:times){ |i| i * i  }
> powers.collect 
> => [0, 1, 4, 9]

I tried the implementation of these two experimentally.  But I
feel enum_filter is overdoing after all.

This patch provides block for Enumerable#enum_for and
Enumerable#enum_if instead.

  $ ./ruby -renumerator -e 'p 5.enum_for(:times){|i| i*i}.to_a'
  [0, 1, 4, 9, 16]
  $ ./ruby -renumerator -e 'p 5.enum_for(:times).enum_if{|i| i[0] == 0}.to_a'
  [0, 2, 4]

Just my 2 yens.


Index: eval.c
===================================================================
RCS file: /cvs/ruby/src/ruby/eval.c,v
retrieving revision 1.663
diff -U2 -p -d -r1.663 eval.c
--- eval.c	14 May 2004 16:45:21 -0000	1.663
+++ eval.c	18 May 2004 01:02:30 -0000
@@ -141,5 +141,5 @@ static VALUE rb_f_block_given_p _((void)
 static VALUE block_pass _((VALUE,NODE*));
 static VALUE rb_cMethod;
-static VALUE method_call _((int, VALUE*, VALUE));
+VALUE rb_method_call _((int, VALUE*, VALUE));
 static VALUE rb_cUnboundMethod;
 static VALUE umethod_bind _((VALUE, VALUE));
@@ -8116,6 +8116,6 @@ proc_invoke(proc, args, self, klass)
  */
 
-static VALUE
-proc_call(proc, args)
+VALUE
+rb_proc_call(proc, args)
     VALUE proc, args;		/* OK */
 {
@@ -8606,5 +8606,5 @@ method_unbind(obj)
  */
 
-static VALUE
+VALUE
 rb_obj_method(obj, vid)
     VALUE obj;
@@ -8686,6 +8686,6 @@ method_clone(self)
  */
 
-static VALUE
-method_call(argc, argv, method)
+VALUE
+rb_method_call(argc, argv, method)
     int argc;
     VALUE *argv;
@@ -8981,5 +8981,5 @@ bmcall(args, method)
 
     a = svalue_to_avalue(args);
-    return method_call(RARRAY(a)->len, RARRAY(a)->ptr, method);
+    return rb_method_call(RARRAY(a)->len, RARRAY(a)->ptr, method);
 }
 
@@ -9179,7 +9179,7 @@ Init_Proc()
 
     rb_define_method(rb_cProc, "clone", proc_clone, 0);
-    rb_define_method(rb_cProc, "call", proc_call, -2);
+    rb_define_method(rb_cProc, "call", rb_proc_call, -2);
     rb_define_method(rb_cProc, "arity", proc_arity, 0);
-    rb_define_method(rb_cProc, "[]", proc_call, -2);
+    rb_define_method(rb_cProc, "[]", rb_proc_call, -2);
     rb_define_method(rb_cProc, "==", proc_eq, 1);
     rb_define_method(rb_cProc, "eql?", proc_eq, 1);
@@ -9199,6 +9199,6 @@ Init_Proc()
     rb_define_method(rb_cMethod, "hash", method_hash, 0);
     rb_define_method(rb_cMethod, "clone", method_clone, 0);
-    rb_define_method(rb_cMethod, "call", method_call, -1);
-    rb_define_method(rb_cMethod, "[]", method_call, -1);
+    rb_define_method(rb_cMethod, "call", rb_method_call, -1);
+    rb_define_method(rb_cMethod, "[]", rb_method_call, -1);
     rb_define_method(rb_cMethod, "arity", method_arity, 0);
     rb_define_method(rb_cMethod, "inspect", method_inspect, 0);
Index: ext/enumerator/enumerator.c
===================================================================
RCS file: /cvs/ruby/src/ruby/ext/enumerator/enumerator.c,v
retrieving revision 1.3
diff -U2 -p -d -r1.3 enumerator.c
--- ext/enumerator/enumerator.c	17 Oct 2003 14:09:43 -0000	1.3
+++ ext/enumerator/enumerator.c	19 May 2004 02:40:29 -0000
@@ -14,9 +14,70 @@
 
 #include "ruby.h"
-#include "node.h"
 
 static VALUE rb_cEnumerator;
 static ID sym_each, sym_each_with_index, sym_each_slice, sym_each_cons;
-static ID id_new, id_enum_obj, id_enum_method, id_enum_args;
+#if !defined(HAVE_RB_PROC_CALL) || !defined(HAVE_RB_METHOD_CALL)
+static ID id_call;
+#endif
+
+static VALUE
+proc_call(proc, args)
+    VALUE proc, args;
+{
+#ifdef HAVE_RB_PROC_CALL
+    if (TYPE(args) != T_ARRAY) {
+	args = rb_values_new(1, args);
+    }
+    return rb_proc_call(proc, args);
+#else
+    return rb_funcall2(proc, id_call, 1, &args);
+#endif
+}
+
+static VALUE
+method_call(method, args)
+    VALUE method, args;
+{
+#ifdef HAVE_RB_METHOD_CALL
+    return rb_method_call(RARRAY(args)->len, RARRAY(args)->ptr, method);
+#else
+    return rb_funcall2(method, id_call, RARRAY(args)->len, RARRAY(args)->ptr);
+#endif
+}
+
+struct enumerator {
+    VALUE method;
+    VALUE proc;
+    VALUE args;
+    VALUE (*iter)_((VALUE, struct enumerator *));
+};
+
+static void
+enumerator_mark(ptr)
+    struct enumerator *ptr;
+{
+    rb_gc_mark(ptr->method);
+    rb_gc_mark(ptr->proc);
+    rb_gc_mark(ptr->args);
+}
+
+static struct enumerator *
+enumerator_ptr(obj)
+    VALUE obj;
+{
+    struct enumerator *ptr = DATA_PTR(obj);
+    if (!ptr) {
+	rb_raise(rb_eArgError, "uninitialized enumerator");
+    }
+    return ptr;
+}
+
+static VALUE
+enumerator_iter_i(i, e)
+    VALUE i;
+    struct enumerator *e;
+{
+    return rb_yield(proc_call(e->proc, i));
+}
 
 static VALUE
@@ -26,5 +87,7 @@ obj_to_enum(obj, enum_args)
     rb_ary_unshift(enum_args, obj);
 
-    return rb_apply(rb_cEnumerator, id_new, enum_args);
+    return rb_class_new_instance(RARRAY(enum_args)->len,
+				 RARRAY(enum_args)->ptr,
+				 rb_cEnumerator);
 }
 
@@ -33,14 +96,17 @@ enumerator_enum_with_index(obj)
     VALUE obj;
 {
-    return rb_funcall(rb_cEnumerator, id_new, 2, obj, sym_each_with_index);
+    VALUE args[2];
+    args[0] = obj;
+    args[1] = sym_each_with_index;
+    return rb_class_new_instance(2, args, rb_cEnumerator);
 }
 
 static VALUE
-each_slice_i(val, memo)
+each_slice_i(val, args)
     VALUE val;
-    NODE *memo;
+    VALUE *args;
 {
-    VALUE ary = memo->u1.value;
-    long size = memo->u3.cnt;
+    VALUE ary = args[0];
+    long size = (long)args[1];
 
     rb_ary_push(ary, val);
@@ -48,5 +114,5 @@ each_slice_i(val, memo)
     if (RARRAY(ary)->len == size) {
 	rb_yield(ary);
-	memo->u1.value = rb_ary_new2(size);
+	args[0] = rb_ary_new2(size);
     }
 
@@ -59,17 +125,16 @@ enum_each_slice(obj, n)
 {
     long size = NUM2LONG(n);
-    NODE *memo;
-    VALUE ary;
+    VALUE args[2], ary;
 
     if (size <= 0) rb_raise(rb_eArgError, "invalid slice size");
 
-    memo = rb_node_newnode(NODE_MEMO, rb_ary_new2(size), 0, size);
+    args[0] = rb_ary_new2(size);
+    args[1] = (VALUE)size;
 
-    rb_iterate(rb_each, obj, each_slice_i, (VALUE)memo);
+    rb_iterate(rb_each, obj, each_slice_i, (VALUE)args);
 
-    ary = memo->u1.value;
+    ary = args[0];
     if (RARRAY(ary)->len > 0) rb_yield(ary);
 
-    rb_gc_force_recycle((VALUE)memo);
     return Qnil;
 }
@@ -79,14 +144,18 @@ enumerator_enum_slice(obj, n)
     VALUE obj, n;
 {
-    return rb_funcall(rb_cEnumerator, id_new, 3, obj, sym_each_slice, n);
+    VALUE args[2];
+    args[0] = obj;
+    args[1] = sym_each_slice;
+    args[2] = n;
+    return rb_class_new_instance(3, args, rb_cEnumerator);
 }
 
 static VALUE
-each_cons_i(val, memo)
+each_cons_i(val, args)
     VALUE val;
-    NODE *memo;
+    VALUE *args;
 {
-    VALUE ary = memo->u1.value;
-    long size = memo->u3.cnt;
+    VALUE ary = args[0];
+    long size = (long)args[1];
     long len = RARRAY(ary)->len;
 
@@ -107,13 +176,12 @@ enum_each_cons(obj, n)
 {
     long size = NUM2LONG(n);
-    NODE *memo;
-    VALUE ary;
+    VALUE args[3];
 
     if (size <= 0) rb_raise(rb_eArgError, "invalid size");
-    memo = rb_node_newnode(NODE_MEMO, rb_ary_new2(size), 0, size);
+    args[0] = rb_ary_new2(size);
+    args[1] = (VALUE)size;
 
-    rb_iterate(rb_each, obj, each_cons_i, (VALUE)memo);
+    rb_iterate(rb_each, obj, each_cons_i, (VALUE)args);
 
-    rb_gc_force_recycle((VALUE)memo);
     return Qnil;
 }
@@ -123,5 +191,41 @@ enumerator_enum_cons(obj, n)
     VALUE obj, n;
 {
-    return rb_funcall(rb_cEnumerator, id_new, 3, obj, sym_each_cons, n);
+    VALUE args[2];
+    args[0] = obj;
+    args[1] = sym_each_cons;
+    args[2] = n;
+    return rb_class_new_instance(3, args, rb_cEnumerator);
+}
+
+static VALUE
+enumerator_select(i, e)
+    VALUE i;
+    struct enumerator *e;
+{
+    if (!RTEST(proc_call(e->proc, i))) return Qnil;
+    return rb_yield(i);
+}
+
+static VALUE
+enumerator_enum_if(obj, enum_args)
+    VALUE obj, enum_args;
+{
+    rb_ary_unshift(enum_args, obj);
+
+    obj = rb_class_new_instance(RARRAY(enum_args)->len,
+				RARRAY(enum_args)->ptr,
+				rb_cEnumerator);
+    ((struct enumerator *)DATA_PTR(obj))->iter = enumerator_select;
+    return obj;
+}
+
+static VALUE enumerator_allocate _((VALUE));
+static VALUE
+enumerator_allocate(klass)
+    VALUE klass;
+{
+    struct enumerator *ptr;
+    return Data_Make_Struct(rb_cEnumerator, struct enumerator,
+			    enumerator_mark, -1, ptr);
 }
 
@@ -133,4 +237,5 @@ enumerator_initialize(argc, argv, obj)
 {
     VALUE enum_obj, enum_method, enum_args;
+    struct enumerator *ptr = enumerator_ptr(obj);
 
     rb_scan_args(argc, argv, "11*", &enum_obj, &enum_method, &enum_args);
@@ -139,16 +244,25 @@ enumerator_initialize(argc, argv, obj)
 	enum_method = sym_each;
 
-    rb_ivar_set(obj, id_enum_obj, enum_obj);
-    rb_ivar_set(obj, id_enum_method, enum_method);
-    rb_ivar_set(obj, id_enum_args, enum_args);
+    ptr->method = rb_obj_method(enum_obj, enum_method);
+    if (rb_block_given_p()) {
+	ptr->proc = rb_block_proc();
+	ptr->iter = enumerator_iter_i;
+    }
+    else {
+	ptr->iter = (VALUE (*)())rb_yield;
+    }
+    ptr->args = enum_args;
 
-    return Qnil;
+    return obj;
 }
 
+static VALUE enumerator_iter _((VALUE));
 static VALUE
-enumerator_iter(memo)
-    NODE *memo;
+enumerator_iter(arg)
+    VALUE arg;
 {
-    return rb_apply(memo->u1.value, memo->u2.id, memo->u3.value);
+    struct enumerator *e = (struct enumerator *)arg;
+
+    return method_call(e->method, e->args);
 }
 
@@ -157,13 +271,16 @@ enumerator_each(obj)
     VALUE obj;
 {
-    VALUE val;
+    struct enumerator *e = enumerator_ptr(obj);
 
-    obj = (VALUE)rb_node_newnode(NODE_MEMO,
-				 rb_ivar_get(obj, id_enum_obj),
-				 rb_to_id(rb_ivar_get(obj, id_enum_method)),
-				 rb_ivar_get(obj, id_enum_args));
-    val = rb_iterate((VALUE (*)_((VALUE)))enumerator_iter, obj, rb_yield, 0);
-    rb_gc_force_recycle(obj);
-    return val;
+    return rb_iterate(enumerator_iter, (VALUE)e, e->iter, (VALUE)e);
+}
+
+static VALUE
+enumerator_call(obj, args)
+    VALUE obj, args;
+{
+    struct enumerator *e = enumerator_ptr(obj);
+
+    return method_call(e->method, rb_ary_concat(e->args, args));
 }
 
@@ -183,10 +300,13 @@ Init_enumerator()
     rb_define_method(rb_mEnumerable, "each_cons", enum_each_cons, 1);
     rb_define_method(rb_mEnumerable, "enum_cons", enumerator_enum_cons, 1);
+    rb_define_method(rb_mEnumerable, "enum_if", enumerator_enum_if, -2);
 
     rb_cEnumerator = rb_define_class_under(rb_mEnumerable, "Enumerator", rb_cObject);
     rb_include_module(rb_cEnumerator, rb_mEnumerable);
 
+    rb_define_alloc_func(rb_cEnumerator, enumerator_allocate);
     rb_define_method(rb_cEnumerator, "initialize", enumerator_initialize, -1);
     rb_define_method(rb_cEnumerator, "each", enumerator_each, 0);
+    rb_define_method(rb_cEnumerator, "call", enumerator_call, -2);
 
     sym_each		= ID2SYM(rb_intern("each"));
@@ -195,7 +315,6 @@ Init_enumerator()
     sym_each_cons	= ID2SYM(rb_intern("each_cons"));
 
-    id_new		= rb_intern("new");
-    id_enum_obj		= rb_intern("enum_obj");
-    id_enum_method	= rb_intern("enum_method");
-    id_enum_args	= rb_intern("enum_args");
+#if !defined(HAVE_RB_PROC_CALL) || !defined(HAVE_RB_METHOD_CALL)
+    id_call = rb_intern("call");
+#endif
 }
Index: ext/enumerator/extconf.rb
===================================================================
RCS file: ext/enumerator/extconf.rb
diff -N ext/enumerator/extconf.rb
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ext/enumerator/extconf.rb	18 May 2004 11:50:10 -0000
@@ -0,0 +1,5 @@
+require 'mkmf'
+
+%w"rb_obj_method rb_method_call".all? {|f| have_func(f, "ruby.h")}
+have_func("rb_proc_call", "ruby.h")
+create_makefile("enumerator")


-- 
Nobu Nakada

In This Thread