var AST = require('./program'); AST.Function = function(name, args, variables, statements){ if (typeof name != 'string'){ statements = variables; variables = args; args = name; name = null; } if (statements instanceof AST.Expression) statements = new AST.Return(statements); statements = AST.Block(statements); this.name = name; this.arguments = args; this.statements = statements; this.variables = variables; }; AST.Function.prototype = new AST.Expression(); AST.Function.prototype.writeTo = function(write, format){ write(this.name ? 'function ' + this.name + '(' : 'function('); if (this.arguments){ for (var i = 0, l = this.arguments.length; i < l; i++){ if (i > 0) write(', '); write(this.arguments[i].name); } } write('){\n'); this.statements.writeTo(write, format); write('}'); }; AST.Function.prototype.compile = function(){ var l = this.arguments.length, args = new Array(l + 1), body = []; for (var i = 0; i < l; i++) args[i] = this.arguments[i].name; this.statements.writeTo(function(str){ body.push(str); }); args[l] = body.join(''); return Function.apply(Function, args); };