You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
42 lines
1.0 KiB
42 lines
1.0 KiB
#! /usr/bin/node
|
|
|
|
var typ = require("./representation.js");
|
|
var parse = require("./parse.js");
|
|
var tokenizer = require("./tokenize.js");
|
|
var pprint = require("./pprint.js");
|
|
|
|
|
|
//var istr = fs.readFileSync('/dev/stdin').toString();
|
|
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 evaluateAll(ast, environment) {
|
|
var l = ast.length;
|
|
var evaled = [];
|
|
for (var i = 0; i < l; i++) {
|
|
evaled.push(evaluate(ast[i], environment));
|
|
}
|
|
return evaled;
|
|
}
|
|
|
|
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));
|
|
|
|
|