I've been using my own JS currying implementation in a few projects[1], which pretty much matches the implementation in the article: count the function's parameter number and build up argument lists in closures until we have enough to call the function, then pass them all in.
However, when I was implementing the same thing in PHP[2] I discovered a nice alteration we can make: instead of passing all arguments to the curried function, we should only pass the minimum number. If we have any left over, we should pass them to the return value. This lets us chain even more things together[3]. For example:
// "c" is our currying function
var id = c(function(x) { return x; });
var triple = c(function(x, y, z) { return x + y + z; });
// These work with both currying functions
id(triple)('Hell', 'o Wor', 'ld');
id(triple)('Hell')('o Wor', 'ld');
id(triple)('Hell', 'o Wor')('ld');
id(triple)('Hell')('o Wor')('ld');
// These only work with the altered version
id(triple, 'Hell', 'o Wor', 'ld');
id(triple, 'Hell')('o Wor', 'ld');
id(triple, 'Hell', 'o Wor')('ld');
id(triple, 'Hell')('o Wor')('ld');
[1] http://chriswarbo.net/index.php?page=news&type=view&id=curry...[2] http://chriswarbo.net/index.php?page=news&type=view&id=admin...
[3] http://chriswarbo.net/index.php?page=news&type=view&id=admin...