JavaScriptって、の続き

具体的には、ゲームなんかで

function playTutorial() {
  message('歩きます。');        // メッセージwindowが開き、クリックすると次に進む
  walk();                       // プレイヤーが歩く。アニメーションが終わると次に進む
  message('歩きました。');
}

こう書きたい。function を chain させるのは記述が面倒で嫌。HTML5 でマルチスレッドが使えるという Web Workers も、yield とかできないのでこういう用途には使えないっぽい。JavaAppletを使ってJavaScriptをsleepさせる裏技があるようなのでそれを使って、とかWeb Workers でビジーウェイトさせて、とか考えたけど相当いまいち。そうなるとメタ言語みたいな方向ですかね、というわけですぐ使えそうなのが Concurrent.Thread である。

var  message = Concurrent.Thread.compile(function(msg) {
  document.body.innerHTML = msg;
  var thread = Concurrent.Thread.self();
  document.onclick = function() {
    document.onclick = null;
    thread.notify();
  };
  try {
    Concurrent.Thread.stop();
  } catch(e) {}
});

var walk = Concurrent.Thread.compile(function() {
  document.body.innerHTML = 'walking';
  for (var i = 0; i < 5; i++) {
    Concurrent.Thread.sleep(1000);
    document.body.innerHTML += '.';
  }
});

Concurrent.Thread.create(playTutorial);

牧さんすごいねー。

重大な問題が

Concurrent.Thread は Array.prototype などを拡張しているので、多くのJavaScriptフレームワークと競合する。こまったねー。