脳ざらし紀行


2007-06-13

_ Rhino と JVM と callcc

Rhino は JVM 上で callcc を実現していると2ちゃんねるの ruby スレに書いてあったんで、ちょっと調べたわけだけど。確かに、Rhino は継続を実装しているけど、これって VM を Java で書いているじゃん。そりゃ継続でもなんでも実装できるだろ。文書中では interpretive mode と呼ばれている。

Rhino には JavaScript のコードを JVM のバイトコードに変換する機能も interpretive mode とは別に搭載されている。

_ サンタクロース

 tonakai = nil
 kobito = nil
 santa = nil
 sansangogo = nil
 r = nil
 
 tonakai = Array.new(10){
   lambda{ santa.yield(:tonakai) }
 }
 
 kobito = Array.new(3){
   lambda{ santa.yield(:kobito) }
 }
 
 santa = Fiber.new do
   h = Hash.new(0)
   loop do
     guest = sansangogo.yield
     ret = h[guest] += 1
     puts "#{guest}, #{ret}"
     if guest == :kobito and ret == 3
       puts "3 Kobitos are reached."
       break r = :go_kaiging
     elsif guest == :tonakai and ret == 9
       puts "9 Tonakais are reached."
       break r = :go_delivering
     end   
   end
 end    
 
 sansangogo = Fiber.new do
   loop do
     break if not r.nil? or ( tonakai.size == 0 and kobito.size == 0 )
     if rand(tonakai.size + kobito.size + 1) < tonakai.size
       tonakai.pop.yield
     else
       kobito.pop.yield
     end
   end
 end
 santa.yield

_ Fiber.loop{|v| ...}

Fiber のブロックの中でループを回すことが多いだろうから、Fiber.loop{|v| ...} みたいなのがあったら便利かと思ったけど、そうでもないか。直観的な仕様を思いつかない。

お名前:
E-mail:
コメント:
本日のリンク元

最近のコメント

2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|04|05|
2011|04|
2012|03|07|
2013|01|02|07|
トップ «前の日記(2007-06-03) 最新 次の日記(2007-06-14)» 編集