jueves, 26 de marzo de 2009

currying functions

Currando funciones en javascript ja, esto es un tema avanzado asi que a todos los que se aburren mucho con mis otros post les comento que este les va a encantar.
que son las curried functions. Simple son funciones que si reciben menos paramtros de los que deberian recibir simplemente se compilan a si mismas con los parametros que recibieron y devuelven una función que solo necesita un parametro para terminar su ejecución.
Veamos un ejemplo simple
supongamos que la funcion myFunc suma dos parametros

alert(myFunc(2,2)); // devuelve 4
var adds4 = myFunc(4); // adds4, es ahora una función,
// que le suma 4, a lo que reciba de argumento.
alert(adds4(5)); // devuelve 9.


bien ahora veamos como implementar esta funcion

function add(a, b) {
if (arguments.length < 1) {

return add;

} else if (arguments.length < 2) {

return function(c) {

return a + c
}

} else {

return a + b;
}
}

No es mucho mas complicada, pero tampoco muy generica verdad? bueno
podemos encontrar una solución mucho mas elegante en la siguiente funcion

function curry(func,args,space) {
var n = func.length - args.length; //arguments still to come
var sa = Array.prototype.slice.apply(args); // saved accumulator array
function accumulator(moreArgs,sa,n) {
var saPrev = sa.slice(0); // to reset
var nPrev = n; // to reset
for(var i=0;i<moreArgs.length;i++,n--) {
sa[sa.length] = moreArgs[i];
}
if ((n-moreArgs.length)<=0) {
var res = func.apply(space,sa);
// reset vars, so curried function can be applied to new params.
sa = saPrev;
n = nPrev;
return res;
} else {
return function (){
// arguments are params, so closure bussiness is avoided.
return accumulator(arguments,sa.slice(0),n);
}
}
}
return accumulator([],sa,n);
}


como la usamos?

function add (a,b,c){
if (arguments.length < this.add.length) {
return curry(this.add,arguments,this);
}
return a+b+c;
}



Sin embargo esta funcion no nos provee precompilación que es la verdadera gracia de curriar funciones, solo sirve para verse bonita.
pero si quieren saber mas sobre curried functions en javascript, les recomiendo que visiten este link y vean el algoritmo de Horspool precompilado en javascript

No hay comentarios:

Publicar un comentario