[#11357] [PATCH] an analogue of `long long' — "Nobuyoshi.Nakada" <nobu.nakada@...>

なかだです。

18 messages 2000/11/01
[#11358] Re: [PATCH] an analogue of `long long' — matz@... (Yukihiro Matsumoto) 2000/11/01

まつもと ゆきひろです

[#11364] Re: [PATCH] an analogue of `long long' — EGUCHI Osamu <eguchi@...> 2000/11/02

えぐち@エスアンドイー です。

[#11440] class Character (was: Ruby I18N) — Yasushi Shoji <yashi@...>

[ruby-dev:11428] からの続きですが、threadは切りました。

14 messages 2000/11/08
[#11442] Re: class Character (was: Ruby I18N) — TAKAHASHI Masayoshi <maki@...> 2000/11/08

高橋征義です。用語について。

[#11443] Re: class Character (was: Ruby I18N) — Yasushi Shoji <yashi@...> 2000/11/08

At Wed, 8 Nov 2000 20:44:55 +0900,

[#11520] A problem of Socket methods on Windows — OKA Toshiyuki <oka@...>

岡と申します。

22 messages 2000/11/15
[#11523] Re: A problem of Socket methods on Windows — "Nobuyoshi.Nakada" <nobu.nakada@...> 2000/11/15

なかだです。

[#11528] Re: A problem of Socket methods on Windows — matz@... (Yukihiro Matsumoto) 2000/11/15

まつもと ゆきひろです

[#11532] Re: A problem of Socket methods on Windows — "Nobuyoshi.Nakada" <nobu.nakada@...> 2000/11/15

なかだです。

[#11534] Re: A problem of Socket methods on Windows — OKA Toshiyuki <oka@...> 2000/11/15

岡です。

[#11535] Re: A problem of Socket methods on Windows — "Nobuyoshi.Nakada" <nobu.nakada@...> 2000/11/15

なかだです。

[#11538] Re: A problem of Socket methods on Windows — "Nobuyoshi.Nakada" <nobu.nakada@...> 2000/11/15

なかだです。

[#11662] IO (Re: fork problem?) — Tanaka Akira <akr@...17n.org>

In article <E140cR3-0002ls-00@ev.netlab.zetabits.co.jp>,

22 messages 2000/11/28
[#11663] Re: IO (Re: fork problem?) — matz@... (Yukihiro Matsumoto) 2000/11/28

まつもと ゆきひろです

[#11664] Re: IO (Re: fork problem?) — Tanaka Akira <akr@...17n.org> 2000/11/28

In article <E140fxW-0002u9-00@ev.netlab.zetabits.co.jp>,

[#11665] Re: IO (Re: fork problem?) — Tanaka Akira <akr@...17n.org> 2000/11/28

In article <hvor93w5wb8.fsf@coulee.m17n.org>,

[#11669] Re: IO (Re: fork problem?) — Tanaka Akira <akr@...17n.org> 2000/11/29

In article <hvoofz05uwz.fsf@coulee.m17n.org>,

[#11672] Re: IO (Re: fork problem?) — matz@... (Yukihiro Matsumoto) 2000/11/29

まつもと ゆきひろです

[#11675] Re: IO (Re: fork problem?) — Koji Arai <JCA02266@...> 2000/11/30

新井です。

[#11677] Re: IO (Re: fork problem?) — matz@... (Yukihiro Matsumoto) 2000/12/01

まつもと ゆきひろです

[ruby-dev:11599] Re: accumulator, Enumerable#{foldr,foldl}

From: Takaaki Tateishi <ttate@...>
Date: 2000-11-19 03:06:19 UTC
List: ruby-dev #11599
立石です.

At Sun, 19 Nov 2000 11:27:39 +0900,
立石 wrote:
> あるいは,Enumerable#{foldl,foldr}のようなものが標準で欲しいので
> すがユーザが定義するべきでしょうか? 個人的には結構使えそうな気が
> 
> [a1,a2,...,an].foldl(a0){|x,y| f(x,y)}
> => f(f(...(f(a0,a1),a2)...))
> 
> [a1,a2,...,an].foldr(a0){|x,y| f(x,y)}
> => f(a1,f(a2,f(...,f(an,a0))))

一応,Enumerableの方は実装してみました
が,こんな感じでいいのでしょうか?
--
Takaaki Tateishi <ttate@jaist.ac.jp>
http://kt-www.jaist.ac.jp:8000/~ttate/


Index: enum.c
===================================================================
RCS file: /home/cvs/ruby/enum.c,v
retrieving revision 1.11
diff -c -r1.11 enum.c
*** enum.c	2000/05/24 04:33:54	1.11
--- enum.c	2000/11/19 03:02:47
***************
*** 322,327 ****
--- 322,371 ----
      return Qnil;
  }
  
+ static VALUE
+ foldl_i(val, memo)
+     VALUE val;
+     NODE *memo;
+ {
+     memo->u3.value = rb_yield(rb_assoc_new(memo->u3.value, val));
+     return Qnil;
+ }
+ 
+ static VALUE
+ enum_foldl(obj, init)
+     VALUE obj, init;
+ {
+     NODE *memo = rb_node_newnode(NODE_MEMO, 0, 0, 0);
+ 
+     memo->u3.value = init;
+     rb_iterate(rb_each, obj, foldl_i, (VALUE)memo);
+     rb_gc_force_recycle((VALUE)memo);
+     return memo->u3.value;
+ };    
+ 
+ static VALUE
+ foldr_i(val, memo)
+     VALUE val;
+     NODE *memo;
+ {
+     memo->u3.value = rb_yield(rb_assoc_new(val, memo->u3.value));
+     return Qnil;
+ }
+ 
+ static VALUE
+ enum_foldr(obj, init)
+     VALUE obj, init;
+ {
+     NODE *memo = rb_node_newnode(NODE_MEMO, 0, 0, 0);
+     ID id_reverse = rb_intern("reverse");
+ 
+     memo->u3.value = init;
+     rb_iterate(rb_each, rb_funcall(obj,id_reverse,0,0), foldr_i, (VALUE)memo);
+     rb_gc_force_recycle((VALUE)memo);
+     return memo->u3.value;
+ };    
+ 
+ 
  void
  Init_Enumerable()
  {
***************
*** 344,349 ****
--- 388,395 ----
      rb_define_method(rb_mEnumerable,"member?", enum_member, 1);
      rb_define_method(rb_mEnumerable,"include?", enum_member, 1);
      rb_define_method(rb_mEnumerable,"each_with_index", enum_each_with_index, 0);
+     rb_define_method(rb_mEnumerable,"foldl", enum_foldl, 1);
+     rb_define_method(rb_mEnumerable,"foldr", enum_foldr, 1);
  
      id_eqq  = rb_intern("===");
      id_each = rb_intern("each");


In This Thread