diff --git a/vm.js b/vm.js index e5410be..d7e6078 100644 --- a/vm.js +++ b/vm.js @@ -7,18 +7,36 @@ var pprint = require("./pprint.js"); //var istr = fs.readFileSync('/dev/stdin').toString(); -var istr = "lambda a b -> (a + b)"; +var istr = "(a + b)"; var ast = parse.parseFull(tokenizer.tokenize(istr)); +function apply(func, p, environment) { + var full_func = evaluate(func, environment); + return [full_func, evaluate(p, environment)]; +} -function evaluate(ast, environment) { +function evaluateAll(ast, environment) { var l = ast.length; + var evaled = []; for (var i = 0; i < l; i++) { - if (ast[i].exprType == "Function") { - console.log(ast[i]); - } + evaled.push(evaluate(ast[i], environment)); } + return evaled; } -evaluate(ast[0], false); +function evaluate(ast, environment) { + if (ast.exprType == "Application") { + return apply(ast.func, ast.p, environment); + } + else if (ast.exprType === "Unary") { /* Unary function application */ + return apply(ast.op, ast.val, environment); + } + else if (ast.exprType === "Name") { + return ast.ident; + } + else { + return ast.val; + } +} +console.log("%j", evaluateAll(ast[0], false));