История изменений
Исправление kaldeon, (текущая версия) :
#include <stdio.h>
#include <stdlib.h>
typedef struct Closure Closure;
typedef Closure *(Func)(Closure *c, int y);
struct Closure
{
int acc;
Func *f;
};
Closure *make(int acc);
Closure *mkclosure(int acc, Func *f)
{
Closure *c;
c = calloc(1, sizeof(*c));
c->acc = acc;
c->f = f;
return c;
}
Closure *run(Closure *c, int y) {return c->f(c, y);}
Closure *f(Closure *c, int y)
{
printf("acc(%d) = %d\n", c->acc, y);
return make(c->acc + y);
}
Closure *make(int acc) {return mkclosure(acc, f);}
Closure *printsum(int x) {return make(x);}
int main(void)
{
run(run(run(printsum(10), 20), 30), 40);
return 0;
}
Исходная версия kaldeon, :
#include <stdio.h>
#include <stdlib.h>
typedef struct Closure Closure;
typedef Closure *(Func)(Closure *c, int y);
struct Closure
{
int acc;
Func *f;
};
Closure *make(int acc);
Closure *mkclosure(int acc, Func *f)
{
Closure *c;
c = calloc(1, sizeof(*c));
c->acc = acc;
c->f = f;
return c;
}
Closure *run(Closure *c, int y) {return c->f(c, y);}
Closure *f(Closure *c, int y)
{
printf("acc(%d) = %d\n", c->acc, y);
return make(c->acc + y);
}
Closure *make(int acc) {return mkclosure(acc, f);}
Closure *printsum(int x) {return make(x);}
int main()
{
run(run(run(printsum(10), 20), 30), 40);
return 0;
}