トップ «前の日記(2008-03-02) 最新 次の日記(2008-03-06)» 編集

Route 477



2008-03-03

[ruby][javascript] JavaScript1.7のyieldがRuby1.9のFiberにそっくりな件

コルーチン!コルーチンじゃないか!

yieldがRubyのyieldと意味が違って混乱しますが、そんな時は以下のように読み替えればおk:

JavaScript1.7Ruby1.9
yield;Fiber.yield
function f(){ .. yield; ..}f = Fiber.new{ .. Fiber.yield .. }
g.next();g.resume()
g.send(10);g.resume(10)

かんたんだね!

[biwascheme] wait-forを使って、イベント処理も同期的に書けるようにした

http-requestでAjaxを同期的に書けるようにしたのに続き、 ボタンのクリック等も同期的に書けるようにしてみた。

(begin
  (print 1)
  (wait-for ($ "foo") "click")
  (print 2))
<input id="foo" type="button" value="click to proceed">

これを実行すると、まず1が表示され、ボタンが押されたあとに2が表示される。

やってることは単純で、wait-forが呼ばれたときにインタプリタの状態を保存し、 ボタンが押されたときに再開するというだけ(あと、2回実行されないように、stopObervingも行う) だけど、実際動いてみるとインパクトあるわ。

以下wait-forのソース。

  define_libfunc("wait-for", 2, 2, function(ar){
    var elem = ar[0], evtype = ar[1];
    return new WebScheme.Pause(function(pause){
      Event.observe(elem, evtype, function(event){ 
        Event.stopObserving(elem, evtype, arguments.callee); // remove handler(=myself)
        return pause.resume(); 
      })
    })
  })

JS1.7ではこんなのも当たり前になるんだなーと思うとなんか感慨深い。

本日のツッコミ(全3件) [ツッコミを入れる]
ささだ (2008-03-04 11:10)

g?

yhara (2008-03-07 03:30)

原文がgだったのでgにしちゃいました。

こて丸 (2009-11-08 11:42)

IEでも yield の使えるフレームワークを構築しました。<br>仕様に付いてご意見等頂けると嬉しいです。<br>ホーム:http://www.ab.auone-net.jp/~kotemaru/wsjs/<br>ブログ:http://blogs.dion.ne.jp/kotemaru/