2006-08-05
JavaScript 1.7 の yield が凄すぎる件について
さっそく、新機能のひとつ、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 ってなんだけ?
トラックバック - http://d.hatena.ne.jp/amachang/20060805/1154743229
リンク元
- 1691 http://www.hatena.ne.jp/
- 1488 http://d.hatena.ne.jp/
- 1099 http://www.yukawanet.com/sunday/
- 1000 http://b.hatena.ne.jp/hotentry
- 936 http://b.hatena.ne.jp/
- 613 http://morino.itigo.jp/
- 538 http://reader.livedoor.com/reader/
- 512 http://secure.ddo.jp/~kaku/tdiary/
- 501 http://www.livedoor.com/blog
- 332 http://yukawanet.com/sunday/
