IT戦記 このページをアンテナに追加 RSSフィード Twitter

2006-08-05

JavaScript 1.7 の yield が凄すぎる件について

Firefox 2.0 beta 1 が出ましたね^^

さっそく、新機能のひとつ、JavaScript 1.7 の yield を使ってみました。

まず yield の動作を試してみた。

var i = 1;
var g = (function() {while(1) {yield i; i++}})();
alert(i); // 1
g.next(i);
g.next(i);
alert(i); // 2

これで分かったこと。

なんと、

yield は関数を途中で終了させている。。。!

実は。

いままで、何度も関数を途中で終了できればなーと思っていた。

JavaScript 以外のほとんどの言語でそれが可能で、それが便利だからである。

それとはなにか、それとはスレッドである。

スレッドCPU レベルで細かーく処理を止めて、いろんな処理の流れを同時に実行させているようなものだ。

yield を使ったら JavaScriptスレッドのようなものを作れるのでは?

という仮説。

実際に作ってみた。

Firefox 2.0 beta 1 など(JavaScript 1.7 以上が動く環境)で見てください。

http://sample.ecmascript.jp/js17.html

うごいた!

四角い箱がぐるぐる回っているのが見えただろうか。

スレッド部分のソースはこんな感じ

function() {
  var $thread;
  while(true) {
    while(this.topCache < 200) {
      yield $thread;
      this.topCache += 2;
      this.style.top = this.topCache + 'px';
      this.style.opacity = this.opacityCache += 0.01;
    }
    while(this.leftCache < 200) {
      yield $thread;
      this.leftCache += 2;
      this.style.left = this.leftCache + 'px';
      this.style.opacity = this.opacityCache -= 0.01;
    }
    while(this.topCache > 100) {
      yield $thread;
      this.topCache -= 2;
      this.style.top = this.topCache + 'px';
      this.style.opacity = this.opacityCache += 0.01;
    }
    while(this.leftCache > 100) {
      yield $thread;
      this.leftCache -= 2; 
      this.style.left = this.leftCache + 'px'
      this.style.opacity = this.opacityCache -= 0.01;
    }
  }
}

あとは setInterval で回すだけ。

setInterval(function() {g.next()}, 10);

これを今までの JavaScript でやったら、どれだけめんどくさいだろうか。

このソースではまだまだ凄さが伝わらないかもしれないけど、

Java などで書かれたスレッド前提のプログラムを JavaScript に移植できるかもしれない。(Orto を使わなくてもw)

それだけじゃない。きっともっともっといろんなことができる!

うはー。夢がひろがりんぐ  (+∀+) いーるどありがとー

何でもできる!We can fly!

え? IE ってなんだけ?

はてブからきましたはてブからきました 2006/08/05 14:58 スレッドというか、コルーチンですかね。
> え? IE ってなんだけ?
動かないよ。うわーーんヽ( ´ー`)ノ

no-nameno-name 2006/08/05 15:30 初めまして。時々読ませていただいております。
この構文は、Pythonのものと同じですね。
http://www-06.ibm.com/jp/developerworks/linux/020809/j_l-pythrd.html

RubyやSchemeは生の継続(continuation)をプログラマが自由に使えます。評価の分かれるところですが、Python流のほうが取っ付きが良くて私は好きです。
まあ、Stackless Pythonなんてものもありますが。

mal_bluemal_blue 2006/08/05 17:15 $thread 変数はなくても動きますが、何のためでしょ?

ryoskryosk 2006/08/05 23:55 JavaScriptでもジェネレータが使えるようになるんですね。
おぉこれはすごい!

AnnAnn 2006/09/12 21:08 Nice site!
[url=http://jplyudko.com/wbhc/fwjb.html]My homepage[/url] | [url=http://lpbiqpqt.com/hdur/ykvo.html]Cool site[/url]

VincentVincent 2006/09/12 21:08 Nice site!
<a href=”http://jplyudko.com/wbhc/fwjb.html”>My homepage</a> | <a href=”http://xoewalvu.com/mzjn/klbv.html”>Please visit</a>

RachelRachel 2006/09/12 21:08 Thank you!
http://jplyudko.com/wbhc/fwjb.html | http://mxieydve.com/gbwz/iggh.html

はてなユーザーのみコメントできます。はてなへログインもしくは新規登録をおこなってください。