/* it's very easy to do a forthlike system in JS.  here it is */
var words = [];
var stack = [];
var state = "interp";
var cword = "";
words["+"] = function(stack) {
        stack.push(stack.shift() + stack.shift());
}
function run_compile1(stack, word)
{
        if (word == ";") {
                state = "interp";
        }
        cword = word;
        words[cword] = new Object();
        words[cword].type = "func";
        words[cword].cmds = [];
        state = "compile2";
}
function run_compile2(stack, word)
{
        if (word == ";") {
                state = "interp";
                return;
        }
        words[cword].cmds.push(word);
}
function run_interp(stack, word)
{
//      if (typeof(words[word]) == "undefined") return; // todo: throw
        if (word == ":") {
                state = "compile1";
                return;
        }
        if (typeof(words[word]) == "object") {
                for (i in words[word].cmds) {
//              print(words[word].cmds[i]);
                        run_interp(stack, words[word].cmds[i]);
                }
        } else if (typeof(words[word]) == "function") {
                words[word](stack);
        } else {
                var v = parseFloat(word);
                if (v != NaN) {
                        stack.push(v);
                } else {
                        stack.push(word);
                }
        }
}
function run(stack, word)
{
        eval("run_" + state + "(stack, word)");
}
run(stack, ":");
run(stack, "test");
run(stack, "3");
run(stack, "4");
run(stack, "+");
run(stack, ";");
//print(stack);
run(stack, "test");
run(stack, "2");
print(stack);
run(stack, "+");
print(stack);
Sunday, December 12, 2010
Subscribe to:
Post Comments (Atom)
 
No comments:
Post a Comment