[#34204] 「プログラミング Ruby 」 p.257 defined? はメソッド? — Noritsugu Nakamura <nnakamur@...>

15 messages 2002/03/05
[#34205] Re: 「プログラミング Ruby 」 p.257 defined? はメソッド? — nobu.nakada@... 2002/03/05

なかだです。

[#34244] しぶらぐっ議事録。 — rubiben <ozaki@...>

48 messages 2002/03/08
[#34246] Re: しぶらぐっ議事録。 — rubikitch <rubikitch@...> 2002/03/08

From: rubiben <ozaki@ruby-lang.org>

[#34250] Re: しぶらぐっ議事録。 — Minero Aoki <aamine@...> 2002/03/09

あおきです。

[#34448] 文字コード混在スクリプトの実行 — Noritsugu Nakamura <nnakamur@...>

14 messages 2002/03/16

[#34453] カレンダー文字列を作るメソッド — Take_tk <ggb03124@...>

たけ(tk)です。

13 messages 2002/03/16

[#34534] スクリプティング言語における GPL — Taku Nakajima <tnakajima@...>

中島@ブレーンです。

26 messages 2002/03/21

[#34552] Re: 1.7 に関して — "井上 浩一" <kyoui32@...>

井上です。

22 messages 2002/03/22
[#34556] Re: 1.7 に関して — "U.Nakamura" <usa@...> 2002/03/22

こんにちは、なかむら(う)です。

[#34590] Ruby FAQ (Re: 1.7 に関して) — TAKAHASHI Masayoshi <maki@...> 2002/03/22

高橋征義です。

[#34570] cgi.rb+ イテレータ — FUJIOKA Takeyuki <fujioka@...>

藤岡です。

15 messages 2002/03/22

[#34676] 安心できる Marshal と、 Ruby バージョンの検査法 — MALTA Koji <malta@...>

丸田と申します。

62 messages 2002/03/30
[#34678] Re: 安心できる Marshal と、 Ruby バージョンの検査法 — Koji Arai <JCA02266@...> 2002/03/31

新井です。

[#34682] Ruby バージョンの検査法 — MALTA Koji <malta@...> 2002/03/31

丸田です。 MarshalとRUBY_VERSIONの話題を分離します。

[#34694] Re: Ruby バージョンの検査法 — WATANABE Hirofumi <eban@...> 2002/04/01

わたなべです。

[#34695] Re: Ruby バージョンの検査法 — shukaku@... 2002/04/01

At Mon, 1 Apr 2002 16:06:23 +0900,

[#34697] Re: Ruby バージョンの検査法 — WATANABE Hirofumi <eban@...> 2002/04/01

わたなべです。

[#34714] Re: Ruby バージョンの検査法 — MALTA Koji <malta@...> 2002/04/01

丸田です。

[#34719] Re: Ruby バージョンの検査法 — HIDAKA Takahiro <cv8t-hdk@...> 2002/04/02

 ひだかです。

[#34738] Re: Ruby バージョンの検査法 — MALTA Koji <malta@...> 2002/04/02

丸田です。

[#34743] Re: Ruby バージョンの検査法 — matz@... (Yukihiro Matsumoto) 2002/04/02

まつもと ゆきひろです

[#34748] Re: Ruby バージョンの検査法 — "NAKAMURA, Hiroshi" <nakahiro@...> 2002/04/03

なひです。

[#34760] Re: Ruby バージョンの検査法 — Koji Arai <JCA02266@...> 2002/04/03

新井です。

[#34765] Re: Ruby バージョンの検査法 — "U.Nakamura" <usa@...> 2002/04/04

こんにちは、なかむら(う)です。

[#34776] Re: Ruby バージョンの検査法 — Tanaka Akira <akr@...17n.org> 2002/04/04

In article <20020404095542.7155.USA@osb.att.ne.jp>,

[#34681] 書籍に関する質問です — Nobuhide Kanagawa <nobuhide@...>

こんにちわ。

17 messages 2002/03/31

[ruby-list:34444] Re: Enumerable#inject (Re: しぶらぐっ議事録。)

From: Koji Arai <JCA02266@...>
Date: 2002-03-16 00:04:58 UTC
List: ruby-list #34444
新井です。

ruby-dev に行ってみます。

In message "[ruby-list:34301] Re: Enumerable#inject (Re:しぶらぐっ議事録。)"
  on 11 Mar 2002 12:58:59 +0900,
  matz@ruby-lang.org (Yukihiro Matsumoto) wrote:
> まつもと ゆきひろです
> 
> In message "[ruby-list:34276] Re: Enumerable#inject (Re: しぶらぐっ議事録。)"
>     on 02/03/10, Koji Arai <JCA02266@nifty.ne.jp> writes:
> 
> |Python ではそうですね。しかし、やっぱり名前問題になるんです
> |ねえ。
> 
> それがすべての問題の本質だからです。

あっ、別に否定的な気持ちで言ったわけではないです。念のため。

知らなかったんですが、Python の reduce は、初期値を指定でき
ますね。で、ruby でどうするか?ですが

1. Enumerable#inject を Enumerable#reduce にし、初期値を省略可にする
2. Enumerable#inject が初期値を省略できるようにする
3. 現状維持

私的には名前はそのままでもいいのではないかと、ですから 2 で
良いように思います。

取り込まれやすさを狙ってパッチをつけてみます。

Index: enum.c
===================================================================
RCS file: /usr/local/cvsup/ruby/ruby/enum.c,v
retrieving revision 1.22
diff -u -p -r1.22 enum.c
--- enum.c	11 Mar 2002 08:02:02 -0000	1.22
+++ enum.c	15 Mar 2002 23:57:41 -0000
@@ -180,21 +180,37 @@ enum_collect(obj)
 }
 
 static VALUE
-inject_i(i, np)
+inject_i(i, memo)
     VALUE i;
-    VALUE *np;
+    NODE *memo;
 {
-    *np = rb_yield(rb_assoc_new(*np, i));
+    if (memo->u2.value) {
+        memo->u2.value = Qfalse;
+        memo->u1.value = i;
+    }
+    else
+        memo->u1.value = rb_yield(rb_assoc_new(memo->u1.value, i));
+
     return Qnil;
 }
 
 static VALUE
-enum_inject(obj, n)
-    VALUE obj, n;
+enum_inject(argc, argv, obj)
+    int argc;
+    VALUE *argv, obj;
 {
-    rb_iterate(rb_each, obj, inject_i, (VALUE)&n);
+    NODE *memo;
+    VALUE n;
 
-    return n;
+    if (rb_scan_args(argc, argv, "01", &n) == 1)
+        memo = rb_node_newnode(NODE_MEMO, n, Qfalse, 0);
+    else
+        memo = rb_node_newnode(NODE_MEMO, Qnil, Qtrue, 0);
+
+    rb_iterate(rb_each, obj, inject_i, (VALUE)memo);
+
+    rb_gc_force_recycle((VALUE)memo);
+    return memo->u1.value;
 }
 
 static VALUE
@@ -448,7 +464,7 @@ Init_Enumerable()
     rb_define_method(rb_mEnumerable,"reject", enum_reject, 0);
     rb_define_method(rb_mEnumerable,"collect", enum_collect, 0);
     rb_define_method(rb_mEnumerable,"map", enum_collect, 0);
-    rb_define_method(rb_mEnumerable,"inject", enum_inject, 1);
+    rb_define_method(rb_mEnumerable,"inject", enum_inject, -1);
     rb_define_method(rb_mEnumerable,"all?", enum_all, 0);
     rb_define_method(rb_mEnumerable,"any?", enum_any, 0);
     rb_define_method(rb_mEnumerable,"min", enum_min, 0);

--
新井康司 (Koji Arai)

In This Thread