comparison interp.js @ 273:0dc7322590da

Make import:from actually work. Fix some macro bugs. Add a cpointer primitive type for storing an opaque pointer to a C object.
author Michael Pavone <pavone@retrodev.com>
date Sun, 20 Jul 2014 00:12:43 -0700
parents 08081b0a9382
children 23b52d2d05a0
comparison
equal deleted inserted replaced
272:bb2b4613fdc8 273:0dc7322590da
755 lambda.prototype.macroexpand = function(parentenv) { 755 lambda.prototype.macroexpand = function(parentenv) {
756 var env = new environment(parentenv); 756 var env = new environment(parentenv);
757 for (var i = 0; i < this.args.length; i++) { 757 for (var i = 0; i < this.args.length; i++) {
758 env.syms[this.args[i].cleanName()] = {}; 758 env.syms[this.args[i].cleanName()] = {};
759 } 759 }
760 var outexprs = []
760 for (var i = 0; i < this.expressions.length; i++) { 761 for (var i = 0; i < this.expressions.length; i++) {
761 var expr = this.expressions[i]; 762 var expr = this.expressions[i];
762 if (expr instanceof assignment) { 763 if (expr instanceof assignment) {
763 if (expr.expression instanceof funcall && expr.expression.name == 'macro:') { 764 if (expr.expression instanceof funcall && expr.expression.name == 'macro:') {
764 env.defMacro(expr.symbol.name, exp.expression.args[0].eval(env)); 765 env.defMacro(expr.symbol.name, expr.expression.args[0].eval(env));
765 } else { 766 } else {
766 env.syms[expr.symbol.cleanName()] = {}; 767 env.syms[expr.symbol.cleanName()] = {};
767 this.expressions[i] = expr.macroexpand(env); 768 outexprs.push(expr.macroexpand(env));
768 try { 769 try {
769 if (this.expressions[i].expression.isconstant()) { 770 if (this.expressions[i].expression.isconstant()) {
770 env.syms[expr.symbol.cleanName()] = this.expressions[i].expression.eval(env); 771 env.syms[expr.symbol.cleanName()] = this.expressions[i].expression.eval(env);
771 } else { 772 } else {
772 env.syms[expr.symbol.cleanName()] = null; 773 env.syms[expr.symbol.cleanName()] = null;
778 } 779 }
779 throw new Error(msg); 780 throw new Error(msg);
780 } 781 }
781 } 782 }
782 } else { 783 } else {
783 this.expressions[i] = expr.macroexpand(env); 784 outexprs.push(expr.macroexpand(env));
784 } 785 }
785 } 786 }
787 this.expressions = outexprs;
786 return this; 788 return this;
787 }; 789 };
788 790
789 lambda.prototype.quote = function(parentenv) { 791 lambda.prototype.quote = function(parentenv) {
790 var args = []; 792 var args = [];