--Apple-Mail-2-400134927
Content-Transfer-Encoding: 7bit
Content-Type: text/plain;
	charset-ASCII;
	delspサ
	竟

マ ニ アイャ イーーカャ  アアコアー チヘャ ハ ニ コ

セ マャ    ノァ      
セ ャ   ネョ ルァ  フ ツァ ョ

ヘ ャ  ャ             
    ョ  チ     
    ノ     ョ

ハ ナ ヌ ノノ


ュュチュヘュイュエーーアウエケイキ
テュヤュナコ キ
テュヤコ ッュュサ
	ュュエエサ
	
゜ョ「 テュトコ サ 獲゜ョ 」。ッッッ 」ュュ 」 、ノコ ッッッッョャ アョク イーーアッアーッーウ ークコオエコウイ ナ 、 」 、メノコ ョャ アョアー イーーウッアーッアエ アケコウカコオク ナ 、 」 、ノコ ョャ アョイョイョイ イーーエッーオッーキ ークコエクコイウ ナ 、 」ォォ 」 」 ョコ 」 」 テ ィゥ イーーアャイーーウ チ ヘユモネチ シタトョセ 」 」 チ ョ ル ッ 」 メョ 」 」 マ 」 」 ヤ ヌ ャ 」 ィョョ ナ ゥ 」 ョ ノ ャ ョ 」 」 ヤ モナ ャ ヌャ 」 ナ ョ 」 」 モ ョ 」 」 ヌ ィョョ ナ ゥ 」 ョ 」 」 ホ 」 ャ ョ 」 」 ナ 」 」 ァァ 」 」 」 ヌ ナ 」 ョィロァチァャ ァツァャ ァテァャ ァレァンゥ 」 」 ョソ 」 ョ 」 」 」 」 ヌ 」 ョ 」 ァチァョョァテァ 」 ョ 」 」 」 ョ ァレァ 」 」 」 」 ヤ 」 ョソ 」 ョ 」 」 テテテヌ ナ 」 テ ナ 」 ョ 」 」 ノ ャ ョ 」 」 ノ ャ 」 ャ ォォ ョ ィ ャ ヲゥ タ ョ ョ タ タ タ ン タ゜ ゜ ゜ タ゜ タョィゥ タ゜ョィゥ タ゜ 」 ル ョ ィゥ タ゜ タ シシ タ゜ョィゥ 」 メ ョ ソィゥ タ゜ タ゜ョソ ヲヲ タョソ タョソ 」 メ ョ ソィゥ 。ソ 」 メ ィゥ ョ ィゥ タ 」 メ ィゥ ョ ィゥ タ 」 メ ョ ィゥ ソ ナマニナャ 「 「 タ゜ タ゜ョィゥ タ゜ タ ォ タョ 」 メ ョ ィゥ タョソ ナマニナャ 「 「 タョ 」 メ ョ ィゥ ィャ ヲタゥ タョソ 」 メ ョ ソ ョ 」 」 モナ ナ ナ 」 ョ 」 」 ナ 」 」 ァァ 」 」 ナョィロアャイャウンャ ロァァャ ァァャ ァァンゥ 」 」 」 ル ロアャ ァァンャ ロイャ ァァンャ ロウャァァン 」 ョ ョィァャ ァゥ 」 」 モナ 」 ナ 」 」 」 テ モナ 」 」 ナ ョ 」 ィェゥ 」 タ ョ ヌョィゥ 」 」 」 」 メ ナ ャ ョョ 」 」 ョ 」 」 タョ 」 」 」 」 メ ナ ャ ョョ 」 」 ョ 」 」 タョ 」 」 」 」 メ ナ 」 」 ョ ノ ャ 」 」 ナ ョ 」 ソィ ゥ 」 ョソ 」 タョ ョソ ソ コ 」 」 タロンョソ 」 」 」 」 」 ナ ナ ョ 」 」 タョ ョ 」 」 」 」 」 ョ 」 ョソ 」 ォ 」 」 」 ョ 」 」 」 」 タョ 」 」 」 」 」 」 」 」 」 、ー ゜゜ニノフナ゜゜ トチヤチョャ ャ 、ーャ ゜゜フノホナ゜゜ォエ ゜゜ナホト゜゜ ァッァ ヤテ゜ヌ シ ヤココユココヤテ ゜ア ョ 」 ァ ゜ィーャ ョゥ ゜ィナマニナゥ ョ ゜イ ョ ァチァョョァテァ ョ ョ ァレァ ゜ィーャ ョゥ ゜ィァチァャ ョゥ ゜ィャ ョソゥ ゜ィーャ ョゥ ゜ィァチァャ ョゥ ゜ィーャ ョゥ ゜ィァチァャ ョゥ ゜ィアャ ョゥ ゜ィャ ョソゥ ゜ィアャ ョゥ ゜ィァツァャ ョゥ ゜ィアャ ョゥ ゜ィァツァャ ョゥ ゜ィャ ョゥ ゜ィーャ ョゥ ゜ィァチァャ ョゥ ゜ィャ ョソゥ ゜ィーャ ョゥ ゜ィァチァャ ョゥ ゜ィーャ ョゥ ゜ィァチァャ ョゥ ゜ィアャ ョゥ ゜ィャ ョソゥ ゜ィアャ ョゥ ゜ィァツァャ ョゥ ゜ィアャ ョゥ ゜ィァツァャ ョゥ ゜ィイャ ョゥ ゜ィャ ョソゥ ゜ィイャ ョゥ ゜ィァテァャ ョゥ ゜ィイャ ョゥ ゜ィァテァャ ョゥ ゜ィウャ ョゥ ゜ィャ ョソゥ ゜ィウャ ョゥ ゜ィァレァャ ョゥ ゜ィウャ ョゥ ゜ィァレァャ ョゥ ゜ィエャ ョゥ ゜ィャ ョソゥ ゜ィナマニナゥ ョ ゜ オャ カャ キャ クャ ケン ョィゥ ョ ゜ィロンャ ゥ ォ ウ ゜ィウャ ゥ ョ ゜ィロンャ ゥ ォ ゜ィオャ ゥ ヤテ゜モナ シ ヤココユココヤテ ゜ ァァョョァァャ アョョアーャ アーョョイーン ョ ョ゜ ーョョョィョ ョョゥゥョ ョ ロン ナョィェゥ ョ ゜ィロンャ ゥ ォ ウ ゜ィウャ ゥ ョ ゜ィロンャ ゥ ォ ゜ィョャ ゥ ュュチュヘュイュエーーアウエケイキ テュヤュナコ キ テュヤコ ッュュサ ュュエエサ aster_generator.rb" Content-Disposition: attachment; filenameter_generator.rb #!/usr/local/bin/ruby -w class FasterGenerator def initialize( enum il ) @index if enum.nil? @queue rray.new yield self else @queue num.to_a end end attr_reader :index alias_method :pos, :index def current raise EOFError, "No more elements available." if end? @queue[@index] end def next raise EOFError, "No more elements available." if end? @queue[(@index + ) - 1] end def next? not end? end def end? @index > queue.size end def rewind @index self end def yield( object ) @queue << object end include Enumerable def each( &block ) @queue.each(&block) self end end #class SyncEnumerator # include Enumerable # # def initialize( *enums ) # @gens nums.map { |e| FasterGenerator.new(e) } # end # # def size # @gens.size # end # # def length # @gens.length # end # # def end?(i il) # if i.nil? # @gens.detect { |g| g.end? } ? true : false # else # @gens[i].end? # end # end # # def each # @gens.each { |g| g.rewind } # # loop do # count # # ret gens.map { |g| # if g.end? # count + # nil # else # g.next # end # } # # if count @gens.size # break # end # # yield ret # end # # self # end #end if $0 __FILE__ eval DATA.read, nil, $0, __LINE__+4 end __END__ require 'test/unit' class TC_Generator < Test::Unit::TestCase def test_block1 g asterGenerator.new { |g| # no yield's } assert_equal(0, g.pos) assert_raises(EOFError) { g.current } end def test_block2 g asterGenerator.new { |g| for i in 'A'..'C' g.yield i end g.yield 'Z' } assert_equal(0, g.pos) assert_equal('A', g.current) assert_equal(true, g.next?) assert_equal(0, g.pos) assert_equal('A', g.current) assert_equal(0, g.pos) assert_equal('A', g.next) assert_equal(1, g.pos) assert_equal(true, g.next?) assert_equal(1, g.pos) assert_equal('B', g.current) assert_equal(1, g.pos) assert_equal('B', g.next) assert_equal(g, g.rewind) assert_equal(0, g.pos) assert_equal('A', g.current) assert_equal(true, g.next?) assert_equal(0, g.pos) assert_equal('A', g.current) assert_equal(0, g.pos) assert_equal('A', g.next) assert_equal(1, g.pos) assert_equal(true, g.next?) assert_equal(1, g.pos) assert_equal('B', g.current) assert_equal(1, g.pos) assert_equal('B', g.next) assert_equal(2, g.pos) assert_equal(true, g.next?) assert_equal(2, g.pos) assert_equal('C', g.current) assert_equal(2, g.pos) assert_equal('C', g.next) assert_equal(3, g.pos) assert_equal(true, g.next?) assert_equal(3, g.pos) assert_equal('Z', g.current) assert_equal(3, g.pos) assert_equal('Z', g.next) assert_equal(4, g.pos) assert_equal(false, g.next?) assert_raises(EOFError) { g.next } end def test_each a 5, 6, 7, 8, 9] g asterGenerator.new(a) i g.each { |x| assert_equal(a[i], x) i + break if i 3 } assert_equal(3, i) i g.each { |x| assert_equal(a[i], x) i + } assert_equal(5, i) end end class TC_SyncEnumerator < Test::Unit::TestCase def test_each r 'a'..'f', 1..10, 10..20] ra .map { |x| x.to_a } a 0...(ra.map {|x| x.size}.max)).map { |i| ra.map { |x| x[i] } } s yncEnumerator.new(*r) i s.each { |x| assert_equal(a[i], x) i + break if i 3 } assert_equal(3, i) i s.each { |x| assert_equal(a[i], x) i + } assert_equal(a.size, i) end end --Apple-Mail-2-400134927 Content-Transfer-Encoding: 7bit Content-Type: text/x-ruby-script; x-unix-mode44; namehread_generator.rb" Content-Disposition: attachment; filenameread_generator.rb #!/usr/bin/env ruby #-- # $Idaemons: /home/cvs/rb/generator.rb,v 1.8 2001/10/03 08:54:32 knu Exp $ # $RoughId: generator.rb,v 1.10 2003/10/14 19:36:58 knu Exp $ # $Id: generator.rb,v 1.12 2005/12/31 02:56:46 ocean Exp $ #++ # # enerator.rb: convert an internal iterator to an external one # # Copyright (c) 2001,2003 Akinori MUSHA <knu / iDaemons.org> # # All rights reserved. You can redistribute and/or modify it under # the same terms as Ruby. # # Overview # # This library provides the Generator class, which converts an # internal iterator (i.e. an Enumerable object) to an external # iterator. In that form, you can roll many iterators independently. # # The SyncEnumerator class, which is implemented using Generator, # makes it easy to roll many Enumerable objects synchronously. # # See the respective classes for examples of usage. # # Generator converts an internal iterator (i.e. an Enumerable object) # to an external iterator. # # Example # # require 'generator' # # # Generator from an Enumerable object # g enerator.new(['A', 'B', 'C', 'Z']) # # while g.next? # puts g.next # end # # # Generator from a block # g enerator.new { |g| # for i in 'A'..'C' # g.yield i # end # # g.yield 'Z' # } # # # The same result as above # while g.next? # puts g.next # end # class ThreadGenerator include Enumerable # Creates a new generator either from an Enumerable object or from a # block. # # In the former, block is ignored even if given. # # In the latter, the given block is called with the generator # itself, and expected to call the +yield+ method for each element. def initialize(enum il, &block) if enum @block roc{|g| enum.each{|value| g.yield value}} else @block lock end @index @queue ] @main_thread il @loop_thread.kill if defined?(@loop_thread) @loop_thread hread.new do Thread.stop begin @block.call(self) rescue @main_thread.raise $! ensure @main_thread.wakeup end end Thread.pass until @loop_thread.stop? self end # Yields an element to the generator. def yield(value) if Thread.current ! loop_thread raise "should be called in Generator.new{|g| ... }" end Thread.critical rue begin @queue << value @main_thread.wakeup Thread.stop ensure Thread.critical alse end self end # Returns true if the generator has reached the end. def end? if @queue.empty? if @main_thread raise "should not be called in Generator.new{|g| ... }" end Thread.critical rue begin @main_thread hread.current @loop_thread.wakeup Thread.stop rescue ThreadError # ignore ensure @main_thread il Thread.critical alse end end @queue.empty? end # Returns true if the generator has not reached the end yet. def next? !end? end # Returns the current index (position) counting from zero. def index @index end # Returns the current index (position) counting from zero. def pos @index end # Returns the element at the current position and moves forward. def next raise EOFError.new("no more elements available") if end? @index + @queue.shift end # Returns the element at the current position. def current raise EOFError.new("no more elements available") if end? @queue.first end # Rewinds the generator. def rewind initialize(nil, &@block) if @index.nonzero? self end # Rewinds the generator and enumerates the elements. def each rewind until end? yield self.next end self end end # # SyncEnumerator creates an Enumerable object from multiple Enumerable # objects and enumerates them synchronously. # # Example # # require 'generator' # # s yncEnumerator.new([1,2,3], ['a', 'b', 'c']) # # # Yields [1, 'a'], [2, 'b'], and [3,'c'] # s.each { |row| puts row.join(', ') } # #class SyncEnumerator # include Enumerable # # # Creates a new SyncEnumerator which enumerates rows of given # # Enumerable objects. # def initialize(*enums) # @gens nums.map { |e| Generator.new(e) } # end # # # Returns the number of enumerated Enumerable objects, i.e. the size # # of each row. # def size # @gens.size # end # # # Returns the number of enumerated Enumerable objects, i.e. the size # # of each row. # def length # @gens.length # end # # # Returns true if the given nth Enumerable object has reached the # # end. If no argument is given, returns true if any of the # # Enumerable objects has reached the end. # def end?(i il) # if i.nil? # @gens.detect { |g| g.end? } ? true : false # else # @gens[i].end? # end # end # # # Enumerates rows of the Enumerable objects. # def each # @gens.each { |g| g.rewind } # # loop do # count # # ret gens.map { |g| # if g.end? # count + # nil # else # g.next # end # } # # if count @gens.size # break # end # # yield ret # end # # self # end #end if $0 __FILE__ eval DATA.read, nil, $0, __LINE__+4 end __END__ require 'test/unit' class TC_Generator < Test::Unit::TestCase def test_block1 g enerator.new { |g| # no yield's } assert_equal(0, g.pos) assert_raises(EOFError) { g.current } end def test_block2 g enerator.new { |g| for i in 'A'..'C' g.yield i end g.yield 'Z' } assert_equal(0, g.pos) assert_equal('A', g.current) assert_equal(true, g.next?) assert_equal(0, g.pos) assert_equal('A', g.current) assert_equal(0, g.pos) assert_equal('A', g.next) assert_equal(1, g.pos) assert_equal(true, g.next?) assert_equal(1, g.pos) assert_equal('B', g.current) assert_equal(1, g.pos) assert_equal('B', g.next) assert_equal(g, g.rewind) assert_equal(0, g.pos) assert_equal('A', g.current) assert_equal(true, g.next?) assert_equal(0, g.pos) assert_equal('A', g.current) assert_equal(0, g.pos) assert_equal('A', g.next) assert_equal(1, g.pos) assert_equal(true, g.next?) assert_equal(1, g.pos) assert_equal('B', g.current) assert_equal(1, g.pos) assert_equal('B', g.next) assert_equal(2, g.pos) assert_equal(true, g.next?) assert_equal(2, g.pos) assert_equal('C', g.current) assert_equal(2, g.pos) assert_equal('C', g.next) assert_equal(3, g.pos) assert_equal(true, g.next?) assert_equal(3, g.pos) assert_equal('Z', g.current) assert_equal(3, g.pos) assert_equal('Z', g.next) assert_equal(4, g.pos) assert_equal(false, g.next?) assert_raises(EOFError) { g.next } end def test_each a 5, 6, 7, 8, 9] g enerator.new(a) i g.each { |x| assert_equal(a[i], x) i + break if i 3 } assert_equal(3, i) i g.each { |x| assert_equal(a[i], x) i + } assert_equal(5, i) end end class TC_SyncEnumerator < Test::Unit::TestCase def test_each r 'a'..'f', 1..10, 10..20] ra .map { |x| x.to_a } a 0...(ra.map {|x| x.size}.max)).map { |i| ra.map { |x| x[i] } } s yncEnumerator.new(*r) i s.each { |x| assert_equal(a[i], x) i + break if i 3 } assert_equal(3, i) i s.each { |x| assert_equal(a[i], x) i + } assert_equal(a.size, i) end end --Apple-Mail-2-400134927 Content-Transfer-Encoding: 7bit Content-Type: text/x-ruby-script; x-unix-mode44; nameime_generators.rb" Content-Disposition: attachment; filenameme_generators.rb #!/usr/local/bin/ruby -w require "benchmark" require "thread_generator" require "callcc_generator" require "faster_generator" tests 0 enum 1..1000).to_a puts puts "### Construction ###" puts Benchmark.bmbm do |x| x.report("New Thread Generator") do (tests * 100).times { ThreadGenerator.new(enum) } end x.report("Old callcc Generator") do (tests * 100).times { CallCCGenerator.new(enum) } end x.report("Array-based FasterGenerator") do (tests * 100).times { FasterGenerator.new(enum) } end end puts puts "### next() ###" puts Benchmark.bmbm do |x| x.report("New Thread Generator") do generator hreadGenerator.new(enum) tests.times do generator.rewind generator.next until generator.end? end end x.report("Old callcc Generator") do generator allCCGenerator.new(enum) tests.times do generator.rewind generator.next until generator.end? end end x.report("Array-based FasterGenerator") do generator asterGenerator.new(enum) tests.times do generator.rewind generator.next until generator.end? end end end --Apple-Mail-2-400134927--