SlideShare a Scribd company logo
Javascript で無限ループ を実現する5つの方法 yhara @京大マイコンクラブ
自己紹介 琵琶湖の方から来ました Javascript 暦は 2 年ちょっと 普段は Ruby 、ほかいろいろ ( 言語マニア ) 学生をしています
京都にはサイ本売ってない説
ヨドバシ++
(1)  普通に無限ループを書く ブラウザが固まります(><) for(;;){ } while(true){ }
予想される反論 無限ループなんてつかわねーよwww 無限でなくても、時間のかかる処理をループさせるとやっぱりブラウザが固まってしまう while( 条件 ){ //  時間のかかる処理 }
(2) setTimeout を使う setTimeout( 関数 ,  ミリ秒 ) 指定した時間後に指定した関数を実行してくれる var f = function(){ // 時間のかかる処理 if( 条件 ) setTimeout (f, 0); }
でも…、 setTimeout はめんどい 同期処理がしたいのに、非同期にしないといけない 現実:  ( 非同期 ) var f = function(){ // 時間のかかる処理 if( 条件 ) setTimeout(f, 0); } 理想 : ( 同期 ) while( 条件 ){ // 時間のかかる処理 }
同様に Ajax もめんどい 同期処理がしたい時も、非同期にしないといけない じゃあどうしたらいい・・・? 現実:  ( 非同期 ) Ajax.get(path, function(data){ alert(data); } 理想 : ( 同期 ) data = Ajax.get(path); alert(data);
(3) jsThread 別名 Thread.Concurrent http://jsthread.sourceforge.net/cgi-bin/wiki/wiki.cgi JavaScript のみ でスレッドシステムを実装! // ↓ ブラウザなぜか固まらない Concurrent.Thread.create (function(){ while( 条件 ){ // 時間のかかる処理 } });
仕組み Javascript で書かれた Javascript パーザ内蔵 指定した関数のソースコードを解析し、自動的に setTimeout を挟んでくれる toSource() でソースが取れる javascript ならでは! 15,119 行 の Javascript (1/8 現在 ) 無茶しやがってwww その他、サイトに解説あり http://jsthread.sourceforge.net/cgi-bin/wiki/wiki.cgi
(4) JSDeffered 関数合成を駆使して、同期処理をそれっぽく書ける http:// coderepos.org/share/wiki/JSDeferred // loop の例: loop (ary, function (n) { // 時間のかかる処理  return wait(0.1);  });  // next の例: loop (5, function (i, o) { // ループ処理 return o.last? i : wait(1);  }). next (function (e) {  // ループが終わったらする処理 print("end ["+e+"]");  })
注意点 つづりが むずかしいです (^o^) Defer  ( 延期する ) + r + ed  とおぼえよう! × Deffered 〇  Deferred
JSDeffered = DSL JavaScript を拡張した新しい言語みたいな感じ parallel() :  並列実行 wait() :  待つ、中断 next() :  順次実行 loop() :  繰り返し error() :  エラー時 言語内言語?
(5) Javascript で別の言語を実装 例えば Scheme http:// mono.kmc.gr.jp/~yhara/w/?BiwaScheme
BiwaScheme Javascript で書かれた Scheme 処理系 http:// mono.kmc.gr.jp/~yhara/w/?BiwaScheme R6RS 準拠を目標に開発中です (><) (sleep 0) のところでインタプリタの状態を保存 setTimeout で指定した時間後にインタプリタを再開 (lambda (f) ;;  時間のかかる処理 (sleep 0) (if  条件  (f)  返り値 )) (let1 s  (http-request (path)) (print s))
JSRuby Javascript で書かれた Ruby 処理系 ( ! ) http://coderepos.org/share/wiki/JSRuby FizzBuzz を動かす程度の能力 sleep はまだなさそうだけど、原理的にはできるはず cf. HotRuby (YARV の中間コードを js で実行 )  http://d.hatena.ne.jp/yukoba/20071231/p1
まとめ さよなら setTimeout とにかくわかりやすく書きたい-> jsThread とにかく軽い方がいい-> JSDeffered ( どちらでもない )-> BiwaScheme
おまけ  (Reposh) Reposh – Repository Shell http://mono.kmc.gr.jp/~yhara/w/?Reposh svn, svk, hg, darcs に対応 ( ディレクトリ構成から自動判定 ) Reposh なし : $ svn st $ svn di foo.rb $ svn ci –m “foo” Reposh あり : > [Enter] > di foo.rb > ci –m “foo”

More Related Content

Javascriptで無限ループを実現する5つの方法