Sunday, December 12, 2010


/* 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);