¸¶¤Ç¤¹¡£

>ÀµÌڤǤ¹¡£
>¸¶ ¿®°ìϺÍÍ¡¢¸æ¶µ¼¨Í­Æñ¤¦¤´¤¶¤¤¤Þ¤¹¡£
>"Ruby ¥×¥í¥°¥é¥ß¥ó¥°ÆþÌç" ¤Ïʬ¤«¤ê¤ä¤¹¤¯¤Æ¡¢°¦ÆÉ¤·¤Æ¤¤¤Þ¤¹¡£

¤¢¤ê¤¬¤È¤¦¤´¤¶¤¤¤Þ¤¹¡£

>¤¿¤À DelayedList ¤Î½ê¤ÏÍý²ò¤¹¤ë¤Î¤Ë¶ìÏ«¤·¤Þ¤·¤¿¡£

¤¢¤½¤³¤ÏÅâÆÍ¤ËÆñ¤·¤¯¤Ê¤Ã¤Æ¤¤¤ë¤Î¤Ç¡¢º£¡ÖÀµÌÚ¡ÝÀÄÌڡפˤè¤ë Sequence
¤ÎÎã¤ò¡¢¤¢¤ÎÁ°¤Ë¾Ò²ð¤¹¤Ù¤­¤À¤Ã¤¿¤È¸å²ù¤·¤Æ¤¤¤Þ¤¹¡£²þÄû¤Î»þ¤ÏÆþ¤ì¤Þ¤·
¤ç¤¦¡£

>(¤Û¤«¤Ë¤ÏÌäÂê¤Î instance_eval)

instance_eval ¤Ë¤Ä¤¤¤Æ¤Ï¤Û¤È¤ó¤É²òÀ⤷¤Þ¤»¤ó¤Ç¤·¤¿¡£¤³¤ì¤â¼êÍî¤Á¡£

>¤³¤ì¤Ï»ä¤Î script ¤Ç $mod=2 ¤È¤·¤¿¤â¤Î¤ÈËܼÁŪ¤Ë¤ÏƱ¤¸¤â¤Î¤À¤È¨Â¤ª¤â¤¤¤Þ¤¹¤¬¡¢
>break ¹Ô¤Î 100 ¤ò m ¤ËÊѤ¨¤ë¤È°Õ¿ÞÄ̤ê¤Ë¤Ïư¤­¤Þ¤»¤ó¡£
>¤³¤ì¤ÏÃ×̿Ū¤Ê·ç´Ù¤À¤È»×¤Ã¤ÆºÎÍѤ·¤Ê¤«¤Ã¤¿¤ï¤±¤Ç¤¹¡£
>Prime ¤ÎÄêµÁ¤Î¤Ê¤«¤Ç¤Î m ¤ÏËÜÍè dummy(¾¤ÎÊÑ¿ô̾¤È¤Ö¤Ä¤«¤é¤Ê¤±£ëu
>²¿¤ò»È¤Ã¤Æ¤â¤¤¤¤)ÊÑ¿ô¤ÎȦ¤Ê¤Î¤Ë¡¢¤³¤Î¾ì¹ç¤Ï¤³¤Î block ¤¬ mai
>n ¤Î
>context ¤Çɾ²Á¤µ¤ì¤ë¤¿¤á dummy ¤Ë¤Ê¤ê¤Þ¤»¤ó¡£
>¤³¤¦¤¤¤¦¾ì¹ç¤Ï¾¤Ç¤ÏÀäÂФ˻Ȥï¤Ê¤¤¤è¤¦¤ÊÊÑ¿ô̾¤ò»È¤¤¤Ê¤µ¤¤¤È¤¤¤¦
>²ò·èºö¤Ï¡¢Programming ¤Î´ðËܤËÈ¿¤¹¤ë(dummy ¤Ï dummy ¤Ç¤¢£ëuñâ¥é¤­¤À
>¤¤¤¦°ÕÌ£¤Ç)¤È»×¤¦¤Î¤Ç¼õ¤±Æþ¤ì¤é¤ì¤Þ¤»¤ó¡£

¤Ê¤ë¤Û¤É¡£¡Ê½ê¡¹Ê¸»ú²½¤±¤·¤Æ¤¤¤ë¤Î¤ÇŬÅö¤ËÁÛÁü¤·¤ÆÊÖ»ö¤·¤Þ¤¹¡£¡Ë
¥Ö¥í¥Ã¥¯¤ò´Ø¿ô¤Î¥ª¥Ö¥¸¥§¥¯¥È²½¤À¤È»×¤Ã¤Æ»È¤¦¤È¡¢¤³¤³¤¬µ¤»ý¤Á°­¤¤¤Ç¤¹¤Í¡£
³Î¤«¤Ë¤½¤ÎÄ̤ê¤Ç¤¹¡£¤³¤ì¤Ë¤Ä¤¤¤Æ¤Ï¤³¤Î ML ¤Ç¤â²¿ÅÙ¤«ÏÃÂê¤Ë¤Ê¤Ã¤¿¤È»×¤¤
¤Þ¤¹¡£

>Âè2°ú¿ô¤ÎɬÍ×À­¤Ë¤Ä¤¤¤Æ¤Ç¤¹¤¬¡¢¡Ä¡Ä
>
>p (Prime*Power[2])[m]
>
>¤È¤ä¤ì¤ÐÅöÁ³ error ¤Ë¤Ê¤ê¤Þ¤¹¡£

¤³¤ì¤Ï Prime*Power[2] ¤¬ p ¤Î°ú¿ô¤È²ò¼á¤µ¤ì¤Æ¤¤¤ë¤«¤é¤Ç¤¹¡£¡Ê¡ÖÆþÌç¡×
¤Î p.75 ¤Ë¤â¾¯¤·²òÀ⤷¤Þ¤·¤¿¤¬¡£¡Ë p() ¤ÎÌá¤êÃÍ nil ¤Ë [] ¤¬»Ü¤µ¤ì¤Æ
¤¤¤Þ¤¹¡£


¤µ¤Æ¡¢¥í¡¼¥«¥ëÊÑ¿ô¤ò¥Ö¥í¥Ã¥¯¤Ë¸ÂÄꤷ¤Æ»È¤¦¤³¤È¤Ï instance_eval ¤ò¤â
¤Ã¤Æ¤·¤Æ¤â¤Ç¤­¤Þ¤»¤ó¡£¤³¤³¤Ï¤ä¤Ï¤ê´Ø¿ô¤òÄêµÁ¤·¤Æ¤½¤ì¤òÅϤ¹¤·¤«¤Ê¤¤¤Ç
¤·¤ç¤¦¡£

class Sequence

    include Enumerable

    def initialize( list, &block )
      @list = list
      @proc = block
    end

    def []( n )
      @list[n] ||= @proc.call( self, n )
    end

    def each
      i = 0
      loop do
        yield self[i]; i += 1
      end
    end

    def *(y)
      x=self
      Sequence.new([]){|seq,n| x[n]*y[n]}
    end

end

m = ARGV[0].to_i

def (Power = {}).[]( x )
    super || Power[x] = Sequence.new([1]) {|seq, n| x * seq[n-1] }
end

def self.sieve(seq, n)
   m = seq[n - 1] + 2
   m += 2 while seq.find{|k|
     break if k * k > m
     m % k == 0
   }
   m
end

Prime = Sequence.new([2,3], &method(:sieve))

p((Power[2]*Prime)[m])

¤³¤³¤Ç¤Ï method ¤Ç Method ¥ª¥Ö¥¸¥§¥¯¥È¤òÀ¸À®¤·¤Æ¡¢¤½¤ì¤òÅϤ·¤Æ¤¤¤Þ¤¹¤¬¡¢
¤¢¤Ã¤µ¤ê :sieve ¤ò¥·¥ó¥Ü¥ë¤È¤·¤Æ¤½¤Î¤Þ¤ÞÅϤ·¤Æ send ¤·¤Æ»È¤¦¤Î¤â·Ú¤¯¤Æ
¤¤¤¤¤«¤È»×¤¤¤Þ¤¹¡£

¤Ç¤â sieve ¤È¤¤¤¦¥á¥½¥Ã¥É̾¤Îº¯Àפ¬¥È¥Ã¥×¥ì¥Ù¥ë¤Î self Æâ¤Ç´³¾Ä¤¹¤ë¤Î¤Ç¡¢
¤¢¤ª¤­¤µ¤ó¤Ê¤é¡¢

Prime = Sequence.new([2,3], & Object.new.instance_eval{
                        def sieve(seq, n)
                          m = seq[n - 1] + 2
                          m += 2 while seq.find{|k|
                            break if k * k > m
                            m % k == 0
                          }
                          m
                        end
                        self}.method(:sieve))

¤È¤³¤³¤Þ¤Ç¤ä¤ë¤«¤â¤·¤ì¤Þ¤»¤ó¡£(^^;

¤Ê¤ª¡¢¤³¤Î°ì»þŪ¤Ê´Ä¶­¤Î¤¿¤á¤Î instance_eval ¤ÎÍøÍÑË¡¤Ï

http://www1.u-netsurf.ne.jp/~brew/mine/ja/ruby/iter.html

¤Ë¤¢¤ê¤Þ¤¹¡£°ø¤ß¤Ë¡¢¤µ¤Þ¤¶¤Þ¤ÊưŪ¤Ê¼ê³¤­¤ÎÍøÍÑË¡¤Î¥³¥ì¥¯¥·¥ç¥ó¤¬

http://blade.nagaokaut.ac.jp/~sinara/ruby/rubynyumon-2000/programing1.html

¤Ë¤¢¤ê¤Þ¤¹¡£»²¹Í¤Ë¤Ê¤ë¤«¤â¡£¡Ê¤Ê¤é¤Ê¤¤¤«¤â¡£¡Ë


>̵¸Â¿ôÎó¤äµé¿ô¤Ë»È¤¦¤Î¤¬¼ç¤ÊÌÜŪ¤Ê¤Î¤Ç¤³¤ì¤¬½ÐÍè¤Ê¤¤¤È»È¤¤Êª¤Ë¤Ê¤ê¤Þ
>¤»¤ó¡£(Cauchy Îó¤Þ¤¿¤Ïµé¿ô¤È¤·¤Æ¼Â¿ô¤½¤Î¤â¤Î¤òɽ¤¹ Real class £ëul
>¤Æ¤¤¤Þ¤¹¤¬¼Â¹Ô®ÅÙ¤ËÌäÂ꤬¤¢¤ê¼ÂÍÑŪ¤Ê¤â¤Î¤Ï̤¤À½ÐÍè¤Þ¤»¤ó¡£)

ÆÃÄê¤Î¿ô¤òɽ¸½¤¹¤ë Cauchy Îó¤òºî¤ë¤³¤È¤Ï¤Ç¤­¤ë¤Ç¤·¤ç¤¦¤¬¡¢°ìÈ̤ˤÏ
Î㤨¤Ð¤¢¤ë¿ôÎó¤¬ Cauchy Îó¤Ç¤¢¤ë¤«Èݤ«¤òÅú¤¨¤ë½Ò¸ì¤ÎÍͤʤâ¤Î¤Ïºî¤ì
¤Ê¤¤¤Î¤Ç¤Ï¤Ê¤¤¤È»×¤¤¤Þ¤¹¡£

>¤³¤ì¤ÏÊØÍø¤À¤È»×¤Ã¤Æ¤¯¤ì¤¿¿Í¤¬°ì¿Í¤â¤¤¤Ê¤«¤Ã¤¿¤Î¤¬¤Á¤ç¤Ã¤È»Äǰ¤À¤Ã¤¿
>¤Î¤Ç¡¢ºÇ¸å¤Ë»ÈÍÑÎã¤ò¾¯¤·¤À¤±:

¤¤¤¨¡¢ÂçÊѶ½Ì£¿¼¤¤¤Ç¤¹¡£¿ô¤½¤Î¤â¤Î¤Ç¤Ï¤Ê¤¯¡¢¿ô¤òµá¤á¤ë¥¢¥ë¥´¥ê¥º¥à¤ò·×»»
ÂоݤȤ¹¤ë¤³¤È¤Ç¡¢Ìµ¸ÂÀºÅ٤η׻»¤¬¤Ç¤­¤Þ¤¹¤Í¡£

¿ô³Ø¤¬¤«¤é¤ó¤Ç¤¯¤ë¤ªÏäʤéÀ§Èó ruby-math ¤Ø¤ª±Û¤·¤¯¤À¤µ¤¤¡£