f8g

vb.jsの日記 : For Next

人気のプログラミング言語VisualBasicっぽく書けるJavaScriptライブラリを開発する日記です。
最初はFor Nextステートメントを実装したいと思います。

function For(start){
	For.isExit = false;

	return {
		To: function(end){
			var step = 1;

			var loop = function(f){
				return {
					Next: function(){
						for(var i = start; i <= end; i += step){
							if(For.isExit) break;
							f(i);
						}
					}
				};
			};

			loop.Step = function(n){
				step = n;
				return loop;
			};

			return loop;
		}
	};
};

function ExitFor(){
	For.isExit = true;
}
For(5).To(10).Step(3)(function(i){
	console.log(i);
}).Next();
// 5, 8

For(5).To(10)(function(i){
	if(i == 8) ExitFor();
	console.log(i);
}).Next();
// 5, 6, 7, 8

ExitForがダメです。ここは妥協してreturn ExitForとします。ヤケクソです。

function For(start){
	return {
		To: function(end){
			var step = 1;

			var loop = function(f){
				return {
					Next: function(){
						for(var i = start; i <= end; i += step){
							if(f(i) == ExitFor) break;
						}
					}
				};
			};

			loop.Step = function(n){
				step = n;
				return loop;
			};

			return loop;
		}
	};
};
For(5).To(10)(function(i){
	if(i == 8) return ExitFor;
	console.log(i);
}).Next();

これで多少はJavaScriptにもVBのよさが出たでしょうか。Nextのような飾りが可愛らしい。
vb.jsの日記の1回目から妥協してしまったので多分続かない。

追記

monjudohさんのコメントを参考にして。

function ExitFor(){
	throw arguments.callee;
}
Next: function(){
	for(var i = start; i <= end; i += step){
		try{
			f(i);
		}
		catch(e){
			if(e == ExitFor) break;
		}
	}
}

これでreturnしなくてもループが抜けられるんですね。

For(5).To(10)(function(i){
	try{
		if(i == 8) ExitFor();
	}
	catch(e){}

	console.log(i);
}).Next();

みたいな使い方をしなければ大丈夫。