Skip to content

Instantly share code, notes, and snippets.

@migimunz
Created May 22, 2011 20:07
Show Gist options
  • Save migimunz/985837 to your computer and use it in GitHub Desktop.
Save migimunz/985837 to your computer and use it in GitHub Desktop.
Javascript partial application
function swap(f)
{
return function(a, b)
{
return f(b, a);
};
}
function ArgPos(i)
{
this.argInd = i;
}
function _(){}
$1 = new ArgPos(0);
$2 = new ArgPos(1);
$3 = new ArgPos(2);
$4 = new ArgPos(3);
$5 = new ArgPos(4);
$6 = new ArgPos(5);
$7 = new ArgPos(6);
$8 = new ArgPos(7);
$9 = new ArgPos(8);
//-----PARTIAL APPLICATION AND ARG REARANGEMENT:
function $$()
{
if(arguments.length < 1)
return _;
else if(arguments.length == 3 && arguments[1] == $2 && arguments[2] == $1)
return swap(arguments[0]);
var f = arguments[0];
var callArgs = Array.prototype.slice.call(arguments, 1);
return function()
{
var index = 0;
for(var i = 0; i < callArgs.length; ++i)
{
if(callArgs[i] == _)
{
callArgs[i] = arguments[index];
index++;
}
else if(callArgs[i] instanceof ArgPos)
{
callArgs[i] = arguments[callArgs[i].argInd];
}
}
return f.apply(null, callArgs);
};
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment