[#31692] cannot run test-all — "U.Nakamura" <usa@...>
こんにちは、なかむら(う)です。
9 messages
2007/09/01
[#31697] Re: [ruby-list:43970] 次の1.8.6 — Tadayoshi Funaba <tadf@...>
> * [ruby-dev:31379]がペンディング
10 messages
2007/09/01
[#31699] Re: [ruby-list:43970] 次の1.8.6
— Urabe Shyouhei <shyouhei@...>
2007/09/01
Tadayoshi Funaba wrote:
[#31700] Re: [ruby-list:43970] 次の1.8.6
— Tadayoshi Funaba <tadf@...>
2007/09/01
> > WIN32OLE も Time も担当でないし、この報告が何をいいたいのかもよくわか
[#31703] Re: [ruby-list:43970] 次の1.8.6
— Urabe Shyouhei <shyouhei@...>
2007/09/01
Tadayoshi Funaba wrote:
[#31706] Re: [ruby-list:43970] 次の1.8.6
— Tadayoshi Funaba <tadf@...>
2007/09/01
> 今後サポートを続けるべきかはご判断にお任せします。OLEで使われてるん
[#31709] [BUG] non-initialized struct — Tanaka Akira <akr@...>
以下のようにすると [BUG] が出ます。
6 messages
2007/09/02
[#31715] string literal encoding — Nobuyoshi Nakada <nobu@...>
なかだです。
12 messages
2007/09/02
[#31716] Re: string literal encoding
— Yukihiro Matsumoto <matz@...>
2007/09/02
まつもと ゆきひろです
[#31729] packed st_table — Nobuyoshi Nakada <nobu@...>
なかだです。
8 messages
2007/09/04
[#31734] [m17n] String#chop & String#succ — Nobuyoshi Nakada <nobu@...>
なかだです。
2 messages
2007/09/05
[#31744] [m17n] String#encode — Nobuyoshi Nakada <nobu@...>
なかだです。
7 messages
2007/09/06
[#31768] shellescape — "Akinori MUSHA" <knu@...>
shellwords.rb に shellescape() 等を追加しようと思います。
5 messages
2007/09/10
[#31774] RSTRING(value)->ptr == NULL ? — Tietew <tietew+ruby-dev@...>
Tietew です。
7 messages
2007/09/11
[#31778] Re: RSTRING(value)->ptr == NULL ?
— Yukihiro Matsumoto <matz@...>
2007/09/12
まつもと ゆきひろです
[#31781] `scan': character encodings differ (ArgumentError) — Kouhei Sutou <kou@...>
須藤です。
5 messages
2007/09/15
[#31787] 文字列のinspect — eklerni <eklerni@...>
eklerniといいます。
5 messages
2007/09/15
[#31798] generator from Enumerable#map — "Yusuke ENDOH" <mame@...>
遠藤と申します。
7 messages
2007/09/19
[#31810] rb_obj_is_kind_of — Tanaka Akira <akr@...>
rb_obj_is_kind_of の TYPE(cl) ですが、[ruby-dev:31805] の例
5 messages
2007/09/21
[#31815] 文字列の式展開 — eklerni <eklerni@...>
eklerniといいます。
6 messages
2007/09/22
[#31835] Kernel#` is blocked with Ruby/GLib2 on Intel Mac — Kouhei Sutou <kou@...>
須藤です。
5 messages
2007/09/24
[#31842] 拡張ライブラリ内での SIGVTALRM — とみたまさひろ <tommy@...>
とみたです。
10 messages
2007/09/24
[#31848] huge `if' dumps core — "Yusuke ENDOH" <mame@...>
遠藤と申します。
5 messages
2007/09/24
[#31850] meta programming might dump core — "Yusuke ENDOH" <mame@...>
遠藤と申します。
2 messages
2007/09/24
[#31853] optimize T_OBJECT space — Tanaka Akira <akr@...>
T_OBJECT なインスタンスで、インスタンス変数の名前をクラス側
7 messages
2007/09/25
[#31880] Re: optimize T_OBJECT space
— Tanaka Akira <akr@...>
2007/09/28
In article <87r6kne799.fsf@fsij.org>,
[ruby-dev:31847] Re: generator from Enumerable#map
From:
"Yusuke ENDOH" <mame@...>
Date:
2007-09-24 17:09:33 UTC
List:
ruby-dev #31847
遠藤です。
> 1.9 では、Enumerable#map や Enumerable#index をブロックなしで呼ぶと
> generator を返すようですが、これは Object#to_enum と何か異なるの
> でしょうか。
情けないことにまだわかってません。気になるので教えていただけません
でしょうか。
> Enumerator で yield の返り値相当などを指定できるなら意味がありそうです。
> 例えば Enumerator#value= と #result を入れてこんな風に。
>
> g = [1, 2, 3].map
> loop { x = g.next; g.value = x * 2 }
> p g.result #=> [2, 4, 6]
>
>
> g = [:a, :b, :c].index
> loop { x = g.next; g.value = x == :b }
> p g.result #=> 1
この拡張が特別に欲しいわけではないのですが、外部イテレータを fiber の
代用とするためには無いと不便なので、試しに実装してみました。
# Fiber#resume の引数 (= Fiber.yield の返値) を指定できないので。
メソッド名やインターフェイスはもっといいのがありそうです。
Index: enumerator.c
===================================================================
--- enumerator.c (revision 13509)
+++ enumerator.c (working copy)
@@ -42,6 +42,8 @@
VALUE method;
VALUE proc;
VALUE args;
+ VALUE value;
+ VALUE result;
enum_iter *iter;
VALUE fib;
VALUE dst;
@@ -55,6 +57,8 @@
rb_gc_mark(ptr->method);
rb_gc_mark(ptr->proc);
rb_gc_mark(ptr->args);
+ rb_gc_mark(ptr->value);
+ rb_gc_mark(ptr->result);
rb_gc_mark(ptr->fib);
rb_gc_mark(ptr->dst);
}
@@ -238,6 +242,8 @@
ptr->iter = (enum_iter *)rb_yield;
}
if (argc) ptr->args = rb_ary_new4(argc, argv);
+ ptr->value = Qnil;
+ ptr->result = Qnil;
ptr->fib = 0;
ptr->dst = Qnil;
ptr->no_next = Qfalse;
@@ -286,6 +292,8 @@
ptr1->proc = ptr0->proc;
ptr1->iter = ptr0->iter;
ptr1->args = ptr0->args;
+ ptr1->value = ptr0->value;
+ ptr1->result = ptr0->result;
ptr1->fib = ptr0->fib;
return obj;
@@ -371,8 +379,9 @@
next_ii(VALUE i, VALUE obj)
{
struct enumerator *e = enumerator_ptr(obj);
+ e->value = Qnil;
rb_fiber_yield(1, &i);
- return Qnil;
+ return e->value;
}
static VALUE
@@ -381,7 +390,7 @@
struct enumerator *e = enumerator_ptr(obj);
VALUE nil = Qnil;
- rb_block_call(obj, rb_intern("each"), 0, 0, next_ii, obj);
+ e->result = rb_block_call(obj, rb_intern("each"), 0, 0, next_ii, obj);
e->no_next = Qtrue;
return rb_fiber_yield(1, &nil);
}
@@ -431,6 +440,36 @@
/*
* call-seq:
+ * e.value = v => v
+ *
+ * Sets the value that current block will return.
+ */
+
+static VALUE
+enumerator_set_value(VALUE obj, VALUE value) {
+ struct enumerator *e = enumerator_ptr(obj);
+
+ e->value = value;
+
+ return value;
+}
+
+/*
+ * call-seq:
+ * e.result => object
+ *
+ * Returns the value that the iteration method returned.
+ */
+
+static VALUE
+enumerator_result(VALUE obj) {
+ struct enumerator *e = enumerator_ptr(obj);
+
+ return e->result;
+}
+
+/*
+ * call-seq:
* e.next? => e
*
* Rewinds the enumeration sequence by the next method.
@@ -467,6 +506,8 @@
rb_define_method(rb_cEnumerator, "to_splat", enumerator_to_splat, 0);
rb_define_method(rb_cEnumerator, "next", enumerator_next, 0);
rb_define_method(rb_cEnumerator, "rewind", enumerator_rewind, 0);
+ rb_define_method(rb_cEnumerator, "value=", enumerator_set_value, 1);
+ rb_define_method(rb_cEnumerator, "result", enumerator_result, 0);
rb_eStopIteration = rb_define_class("StopIteration", rb_eIndexError);
--
Yusuke ENDOH <mame@tsg.ne.jp>