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();
みたいな使い方をしなければ大丈夫。