La combinación perezosa del combinador de punto fijo = λ f . f ( arreglo f ) no funciona en un lenguaje estrictamente evaluado como C. Pero esto no implica que todos los combinadores de punto fijo sean una ilusión de evaluación perezosa. Si se sabe que f acepta y devuelve una función , entonces podemos expandir eta el combinador de punto fijo perezoso en la combinación estricta del combinador de punto fijo = λ f . λ x . f ( arreglo f ) x , y este funciona bien en C:
#include #include /* Closure abstraction */ struct closure { void *(*fn)(void *data, void *arg); void *data; }; struct closure *close(void *(*fn)(void *data, void *arg), void *data) { struct closure *f = malloc(sizeof(struct closure)); f->fn = fn; f->data = data; return f; } void *call(struct closure *f, void *arg) { return f->fn(f->data, arg); } /* Fixed-point combinator */ struct closure *fix(struct closure *f); static void *fix_fn(void *f, void *arg) { return call(call(f, fix(f)), arg); } struct closure *fix(struct closure *f) { return close(&fix_fn, f); } /* Factorial test. */ static void *fact1_fn(void *f, void *arg) { int *n = arg; int *ret = malloc(sizeof(int)); if (*n == 0) { *ret = 1; } else { int n1 = *n - 1; int *m = call(f, &n1); *ret = *n * *m; } return ret; } static void *fact_fn(void *data, void *f) { return close(fact1_fn, f); } int main(void) { struct closure *f = close(&fact_fn, NULL); int n = 5; int *ret; ret = call(fix(f), &n); printf("%d\n", *ret); /* prints 120 */ ret = call(call(f, fix(f)), &n); printf("%d\n", *ret); /* prints 120 */ return 0; }