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 のブロックの中でループを回すことが多いだろうから、Fiber.loop{|v| ...} みたいなのがあったら便利かと思ったけど、そうでもないか。直観的な仕様を思いつかない。
最近のコメント