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| ...} みたいなのがあったら便利かと思ったけど、そうでもないか。直観的な仕様を思いつかない。
最近のコメント