applyでちょっとLispっぽいJavaScript

さっき思いついて1分で書いた。

function _(){
  if(arguments.length === 0){
    return null; // () => nil
  }

  var operator = arguments[0], operands = [];
  for(var i=1, len=arguments.length; i<len; i++){
    operands.push(arguments[i]);
  }
  return operator.apply(null, operands);
}

function plus(a, b){
  return a + b;
}

function multiply(a, b){
  return a * b;
}

_(console.log,
  _(multiply,
    3,
   _(plus, 1, 2)));
// => 9