Javascriptでコネコネ
http://konbu.s13.xrea.com/lib/js/bf/bf.html
何回Brainをf*ckすれば気が済むのですかといったかんじですけど、またBrainfuckインタプリタつくってみた。俺の中では、HelloWorld!の次につくるものとインプットされてるのかもしれない。
なんか、DynamicHTMLでつくる、ブラウザ内で動く偽ウィンドウシステム的なものを妄想していて、でもアプリケーションがエディタだけじゃつまらんな、と。そんで、そういやJavascriptで作ってなかったな、と。とりあえずは動けばいいやと、ちょっと便利なC言語的な書き方した。もっとJavascriptらしく、オブジェクトオブジェクトした書き方もしてみよかなと思っている。
bf.js。メイン部分。bfrunがbfコードと標準入力を文字列で渡すと、標準出力を文字列で返す関数。
function push(stack, value){ stack[stack.length] = value; } function pop(stack){ var value = stack[stack.length-1]; --stack.length; return value; } function bfrun(code, stdin){ var stdout = String(); var mem = Array(30000); for(i=0;i<30000;++i) mem[i] = 0; var cp = 0, mp = 0; var stack = Array(); while(cp < code.length){ switch(code.charAt(cp)){ case '+': ++mem[mp]; break; case '-': --mem[mp]; break; case '>': ++mp; break; case '<': --mp; break; case '.': stdout += String.fromCharCode(mem[mp]); break; case ',': if(stdin.length == 0){ mem[mp] = 0; } else{ mem[mp] = stdin.charCodeAt(0); stdin = stdin.substring(1, stdin.length); } break; case '[': if(mem[mp] == 0){ var nest = 1; while(nest != 0){ ++cp; switch(code[cp]){ case '[': ++nest; break; case ']': --nest; break; } } } else{ push(stack, cp); } break; case ']': cp = pop(stack) - 1; break; } ++cp; } return stdout; }
あとはbf.htmlからbfrun呼んでほげほげー。
もうちょい仕組み変えて、ステップ実行とかでばぐれるようにしたらかっこいいよねーとか思いつつも、たぶんやらない。俺brainfuckで何か書いたことないし。