LINUX.ORG.RU

История изменений

Исправление 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;
}