Mercurial > repos > tabletprog
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 = []; |