From: nobu.nakada@... Date: 2003-07-27T13:47:54+09:00 Subject: [ruby-dev:20935] Re: add library なかだです。 At Sun, 27 Jul 2003 06:05:22 +0900, Akinori MUSHA wrote: >  abbrev.rb もですね。しかし、これらはとりあえず Perl から移植 > してみただけで、今のところマルチバイト文字にも対応していないん > ですが、せめて日本語くらいには対応させたいですね。 $KCODE次第ってことでいいですか。 >  enumerator は詰めよう詰めようと思いつつほったらかしでした。 > 名前の問題と Object にメソッドを追加するというのがどうかという > 二点があったと思いますが、一応、今の構成が私としてはベストと > 思っています。 Objectでも問題ないと思いますが、Kernelのほうがいいかも。 >  generator.rb の方は、実装はともかくとして、物としてはあると > 有用な場面はありそうです。気になっているのは、 end? と next と > いうメソッド名で、 end? はともかく next が予約語とかぶるのが > どうかなと。若干 C# 風に next? と current とする方がよい? > rewind は reset にして。(開始地点も一つずれてわかりやすい?) next?というのは副作用として一つ進めるってことですか。そうすると end?は消すんでしょうか。それともend?, next?, currentの三つにす るということ? かぶってるといえばyieldも。 > > # nodedumpかiiが欲しいって人は、他にはいないんだろうなぁ。 > >  あっていいんじゃないでしょうか。Ruby インタプリタ本体と同期 > している必要もあるので、標準ライブラリとしてメンテナンスする > メリットは大きいと思います。 ruby-coreに振ったほうがいいかな。あ、Dave Thomasは読んでなかっ たっけ。 >  nodedump は、ちょくちょく話に出る割には、どこに最新のものが > あるのか、誰がメンテナンスしているのかわからない不遇の子なので、 > 引き取ってやりたい感じ。 正式版は0.1.7まででしたっけ。 enumeratorの微妙な効率化とabbrevのマルチバイト化。 Index: ext/enumerator/enumerator.c =================================================================== RCS file: /cvs/ruby/src/rough/ext/enumerator/enumerator.c,v retrieving revision 1.5 diff -u -2 -p -r1.5 enumerator.c --- ext/enumerator/enumerator.c 23 Feb 2003 10:00:53 -0000 1.5 +++ ext/enumerator/enumerator.c 27 Jul 2003 03:32:41 -0000 @@ -16,5 +16,5 @@ static VALUE rb_cEnumerator; -static ID id_each, id_each_with_index, id_each_slice, id_each_cons; +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; @@ -32,5 +32,5 @@ enumerator_enum_with_index(obj) VALUE obj; { - return rb_funcall(rb_cEnumerator, id_new, 2, obj, ID2SYM(id_each_with_index)); + return rb_funcall(rb_cEnumerator, id_new, 2, obj, sym_each_with_index); } @@ -78,5 +78,5 @@ enumerator_enum_slice(obj, n) VALUE obj, n; { - return rb_funcall(rb_cEnumerator, id_new, 3, obj, ID2SYM(id_each_slice), n); + return rb_funcall(rb_cEnumerator, id_new, 3, obj, sym_each_slice, n); } @@ -122,5 +122,5 @@ enumerator_enum_cons(obj, n) VALUE obj, n; { - return rb_funcall(rb_cEnumerator, id_new, 3, obj, ID2SYM(id_each_cons), n); + return rb_funcall(rb_cEnumerator, id_new, 3, obj, sym_each_cons, n); } @@ -136,5 +136,5 @@ enumerator_initialize(argc, argv, obj) if (enum_method == Qnil) - enum_method = ID2SYM(id_each); + enum_method = sym_each; rb_ivar_set(obj, id_enum_obj, enum_obj); @@ -146,10 +146,8 @@ enumerator_initialize(argc, argv, obj) static VALUE -enumerator_iter(obj) - VALUE obj; +enumerator_iter(memo) + NODE *memo; { - return rb_apply(rb_ivar_get(obj, id_enum_obj), - rb_to_id(rb_ivar_get(obj, id_enum_method)), - rb_ivar_get(obj, id_enum_args)); + return rb_apply(memo->u1.value, memo->u2.id, memo->u3.value); } @@ -158,5 +156,13 @@ enumerator_each(obj) VALUE obj; { - return rb_iterate(enumerator_iter, obj, rb_yield, 0); + VALUE val; + + 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(enumerator_iter, obj, rb_yield, 0); + rb_gc_force_recycle(obj); + return val; } @@ -166,5 +172,5 @@ Init_enumerator() VALUE rb_mEnumerable; - rb_define_method(rb_cObject, "enum_for", obj_enum_for, -2); + rb_define_method(rb_mKernel, "enum_for", obj_enum_for, -2); rb_mEnumerable = rb_path2class("Enumerable"); @@ -182,8 +188,8 @@ Init_enumerator() rb_define_method(rb_cEnumerator, "each", enumerator_each, 0); - id_each = rb_intern("each"); - id_each_with_index = rb_intern("each_with_index"); - id_each_slice = rb_intern("each_slice"); - id_each_cons = rb_intern("each_cons"); + sym_each = ID2SYM(rb_intern("each")); + sym_each_with_index = ID2SYM(rb_intern("each_with_index")); + sym_each_slice = ID2SYM(rb_intern("each_slice")); + sym_each_cons = ID2SYM(rb_intern("each_cons")); id_new = rb_intern("new"); Index: lib/abbrev.rb =================================================================== RCS file: /cvs/ruby/src/rough/lib/abbrev.rb,v retrieving revision 1.1 diff -u -2 -p -r1.1 abbrev.rb --- lib/abbrev.rb 1 Jun 2001 18:58:29 -0000 1.1 +++ lib/abbrev.rb 27 Jul 2003 04:36:56 -0000 @@ -39,5 +39,6 @@ module Abbrev words.each do |word| - (word.length - 1).downto(1) do |len| + abbrev = word + while (len = abbrev.rindex(/[\w\W]\z/)) > 0 abbrev = word[0,len] -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦