miércoles, 22 de abril de 2009

Programación funcional con ANSI-C

Últimamente parece que se está poniendo de moda la programación funcional, sobre todo desde que por un lado los procesadores multi-threading están a la orden del día y desde que C# lo soporta "oficialmente".

Hace mucho no obstante que es posible usar programación funcional, incluso antes de que ningún lenguaje funcional naciera, C ya soportaba callbacks, con los que se podían llegar a hacer cosas similares a las que hoy en día es el pan de cada día en la programación funcional: las funciones lambda.

Supongo que muchos ya conocereis su existencia y cómo usarlas, pero por si acaso no es así os dejo aquí un código de ejemplo que usé de pruebas en su día:

#include

typedef int (*operation__prototype) (int, int);
typedef void (*callback__prototype) (int);

int add__implementation(int input1, int input2) {
return input1+input2;
}
int mul__implementation(int input1, int input2) {
return input1*input2;
}
void callback__implementation(int result) {
printf("[Operation done! callback called with result: %d]\n", result);
}

int operation(int input1, int input2, operation__prototype what_operation, callback__prototype what_callback) {
int retv;
retv=what_operation(input1, input2);
what_callback(retv);
return retv;
}

int option1(int arg1, int arg2) {
operation__prototype add_proc = add__implementation;
operation__prototype mul_proc = mul__implementation;
callback__prototype callback_proc = callback__implementation;
printf(
"[Hello world, result of operation ADD is %d.]\n\n",
operation(arg1, arg2, add_proc, callback_proc)
);
printf(
"[Hello world, result of operation MUL is %d.]\n\n",
operation(arg1, arg2, mul_proc, callback_proc)
);
}

int option2(int arg1, int arg2) {
printf(
"[Hello world, result of operation ADD is %d.]\n\n",
operation(arg1, arg2, add__implementation, callback__implementation)
);
printf(
"[Hello world, result of operation MUL is %d.]\n\n",
operation(arg1, arg2, mul__implementation, callback__implementation)
);
}

int main(int argc,char** argv) {
int arg1=4;
int arg2=5;
//printf("[$argc = %d]\n",argc);
//if (argc>=1) { printf("[$0 = %s]\n", argv[0]); }
if (argc<3) {
printf("%s: usage %s value1 value2\n", argv[0], argv[0]); return 0;
}
if (argc>=2) {
printf("[value1 = %s]\n", argv[1]); arg1=atoi(argv[1]);
}
if (argc>=3) {
printf("[value2 = %s]\n", argv[2]); arg2=atoi(argv[2]);
}
printf("\n");
return option2(arg1,arg2);
}

No hay comentarios: