_.optarg = function (n, f) {
return function (/* & arguments */) {
var required = Array.prototype.slice.call(arguments, 0, n);
var optional = Array.prototype.slice.call(arguments, n);
required.push(optional);
return _.apply(f, required);
};
};
これで
var f = function () {
var a = arguments[0];
var b = arguments[1];
var rest = Array.prototype.slice.call(arguments, 2);
//...
};
みたいなコードを
var g = _.optarg(2, function (a, b, rest) {
//...
});
みたいに書ける。
_.bin_multi = function (binary_f) {
return _.optarg(2, function (x, y, zs) {
return _.foldl(zs, function (acc, a) {
return binary_f(acc, a);
}, binary_f(x, y));
});
};
これで、
var add = _.bin_multi(function (a, b) {
return a + b;
});
add(1,2,3,4,5,6,7,8,9,10); //=>55
みたいなことができる.