Browse Source

closures!

pull/23/head
nisstyre56 10 years ago
parent
commit
cd1a478560
  1. 5
      closures.js
  2. 2
      environments.js
  3. 6
      parse.js
  4. 40
      vm.js

5
closures.js

@ -153,7 +153,6 @@ function test(src) {
}
//console.log(test("if something then if a then if b then c else d else rtrrt else some_other_thing"));
module.export = {
test : test,
annotate_fvs: annotate_fvs_all
module.exports = {
annotate_fvs : annotate_fvs_all
};

2
environments.js

@ -39,7 +39,7 @@ function makeEnv(name, values) {
function lookup(name, env) {
var value = env.bindings[name];
if (!value) {
throw errors.UnboundError(name, env.name);
throw errors.JUnboundError(name, env.name);
}
return value;
}

6
parse.js

@ -7,7 +7,7 @@ var tokenizer = require("./tokenize.js");
var desugarer = require("./desugar.js");
var pprint = require("./pprint.js");
var error = require("./errors.js");
var closure = require("./closures.js");
var print = console.log;
function sourcePos(tokens, linenum, charnum) {
@ -808,9 +808,11 @@ function parse(tokens) {
function parseFull(tokenized) {
var ast = [];
var typeBindings = {};
var current;
try {
while (tokenized.length > 0) {
ast.push(desugarer.desugar(parse(tokenized), typeBindings));
current = closure.annotate_fvs(desugarer.desugar(parse(tokenized), typeBindings));
ast.push(current);
}
return [ast, typeBindings];
} catch (e) {

40
vm.js

@ -4,21 +4,23 @@ var typ = require("./representation.js");
var parse = require("./parse.js");
var tokenizer = require("./tokenize.js");
var pprint = require("./pprint.js");
var env = require("./environments.js");
//var istr = fs.readFileSync('/dev/stdin').toString();
var istr = "(a + b)";
//var istr = "if true then (+ 6 (a+a*b)) else 1";
var istr = "def (f a) (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 apply(func, p) {
return func(p);
}
function evaluateAll(ast, environment) {
var l = ast.length;
var evaled = [];
for (var i = 0; i < l; i++) {
// should look for closures?
evaled.push(evaluate(ast[i], environment));
}
return evaled;
@ -26,17 +28,39 @@ function evaluateAll(ast, environment) {
function evaluate(ast, environment) {
if (ast.exprType == "Application") {
return apply(ast.func, ast.p, environment);
return apply(evaluate(ast.func, environment), evaluate(ast.p, environment));
}
else if (ast.exprType === "Unary") { /* Unary function application */
return apply(ast.op, ast.val, environment);
return apply(evaluate(ast.op, environment), evaluate(ast.val, environment));
}
else if (ast.exprType === "Name") {
return ast.ident;
//console.log(env.lookup(ast.ident, environment));
return env.lookup(ast.ident, environment);
}
else if (ast.exprType === "If") {
if (evaluate(ast.condition, environment)) {
return evaluate(ast.thenexp, environment);
}
else {
return evaluate(ast.elseexp, environment);
}
}
else if (ast.exprType === "Definition") {
console.log(ast);
}
else {
return ast.val;
}
}
console.log("%j", evaluateAll(ast[0], false));
var testenv = env.makeEnv("toplevel",
[
["+", function(a) { return function(b) { return a + b; } }],
["*", function(a) { return function(b) { return a * b; } }],
["a", 2],
["b", 3]]);
var all = evaluate(ast[0][ast[0].length - 1], testenv);
console.log(all);
//console.log("%j", testenv);
//console.log("%j", ast[0][ast[0].length - 1]);
//console.log("%j", ast[0][ast[0].length - 1]);

Loading…
Cancel
Save