pogo
Version:
A readable, DSL friendly programming language that compiles to JavaScript
73 lines • 2.85 kB
JavaScript
(function() {
var self = this;
var _;
_ = require("underscore");
module.exports = function(terms) {
var self = this;
var splatArgumentsTerm, splatArguments;
splatArgumentsTerm = terms.term({
constructor: function(splatArguments) {
var self = this;
return self.splatArguments = splatArguments;
},
generate: function(scope) {
var self = this;
return self.generateIntoBuffer(function(buffer) {
var i, splatArgument;
for (i = 0; i < self.splatArguments.length; ++i) {
splatArgument = self.splatArguments[i];
if (i === 0) {
buffer.write(splatArgument.generate(scope));
} else {
buffer.write(".concat(");
buffer.write(splatArgument.generate(scope));
buffer.write(")");
}
}
return void 0;
});
}
});
return splatArguments = function(args, optionalArgs) {
var splatArgs, previousArgs, foundSplat, i, current, next, concat;
splatArgs = [];
previousArgs = [];
foundSplat = false;
i = 0;
while (i < args.length) {
current = args[i];
next = args[i + 1];
if (next && next.isSplat) {
foundSplat = true;
if (previousArgs.length > 0) {
splatArgs.push(terms.list(previousArgs));
previousArgs = [];
}
splatArgs.push(current);
++i;
} else if (current.isSplat) {
terms.errors.addTermWithMessage(current, "splat keyword with no argument to splat");
} else {
previousArgs.push(current);
}
++i;
}
if (optionalArgs && optionalArgs.length > 0) {
previousArgs.push(terms.hash(optionalArgs));
}
if (previousArgs.length > 0) {
splatArgs.push(terms.list(previousArgs));
}
if (foundSplat) {
concat = function(initial, last) {
if (initial.length > 0) {
return terms.methodCall(concat(_.initial(initial), _.last(initial)), [ "concat" ], [ last ]);
} else {
return last;
}
};
return concat(_.initial(splatArgs), _.last(splatArgs));
}
};
};
}).call(this);