2008-03-03
■ [ruby][javascript] JavaScript1.7のyieldがRuby1.9のFiberにそっくりな件
コルーチン!コルーチンじゃないか!
yieldがRubyのyieldと意味が違って混乱しますが、そんな時は以下のように読み替えればおk:
JavaScript1.7 | Ruby1.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ではこんなのも当たり前になるんだなーと思うとなんか感慨深い。
g?
原文がgだったのでgにしちゃいました。
IEでも yield の使えるフレームワークを構築しました。<br>仕様に付いてご意見等頂けると嬉しいです。<br>ホーム:http://www.ab.auone-net.jp/~kotemaru/wsjs/<br>ブログ:http://blogs.dion.ne.jp/kotemaru/