Function.method('curry', function() {
    //arguments can not be passed in to closure function
    //var l = arguments.length;
    //var args = [];
    //for (var i = 0; i < l; i++) {
    //    args[i] = arguments[i];
    //}
    var args = Array.prototype.slice.apply(arguments);
    var original_function = this;

    return function() {
        //arguments is not the external arguments
        //for (var i = 0; i < arguments.length; i++) {
        //    args[args.length] = arguments[i];
        //}
        args = args.concat(Array.prototype.slice.call(arguments));
        return original_function.apply(null, args);
    };
});

function add() {
    var sum = 0;
    for (i = 0; i < arguments.length; i++) {
        sum += arguments[i];
    }
    return sum;
}

var add1 = add.curry(1);
var s = add1(2);
alert(s);