#include <stdlib.h>
#include <stdio.h>
typedef float (*linear)(float, void* closure);
typedef struct {
linear fun;
void* closure;
} linear_lambda;
void linear_lambda_free(linear_lambda* ln) {
}
typedef struct {
float a;
float b;
} make_linear_closure;
static float make_linear_inner(float x, void* closure) {
make_linear_closure* cl = closure;
return x*cl->a + cl->b;
}
linear_lambda make_linear(float a, float b) {
make_linear_closure
* cl
= malloc(sizeof(make_linear_closure
)); cl->a = a;
cl->b = b;
linear_lambda res = { make_linear_inner, cl };
return res;
}
void takes_a_linear(float x, linear ln, void* opaque) {
float p1 = ln(x, opaque);
float p2 = ln(2*x, opaque);
printf("Two points on a line: (%f, %f), (%f, %f)\n", x
, p1
, 2*x
, p2
); }
int main() {
linear_lambda l1 = make_linear(2.0, 1.0);
linear_lambda l2 = make_linear(2.0, 3.0);
takes_a_linear(3.0, l1.fun, l1.closure);
takes_a_linear(2.0, l2.fun, l2.closure);
linear_lambda_free(&l2);
linear_lambda_free(&l1);
}
I2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RkaW8uaD4KCgp0eXBlZGVmIGZsb2F0ICgqbGluZWFyKShmbG9hdCwgdm9pZCogY2xvc3VyZSk7CgoKdHlwZWRlZiBzdHJ1Y3QgewoJbGluZWFyIGZ1bjsKCXZvaWQqIGNsb3N1cmU7Cn0gbGluZWFyX2xhbWJkYTsKCnZvaWQgbGluZWFyX2xhbWJkYV9mcmVlKGxpbmVhcl9sYW1iZGEqIGxuKSB7CglmcmVlKGxuLT5jbG9zdXJlKTsKfQoKCnR5cGVkZWYgc3RydWN0IHsKCWZsb2F0IGE7CglmbG9hdCBiOwp9IG1ha2VfbGluZWFyX2Nsb3N1cmU7CgpzdGF0aWMgZmxvYXQgbWFrZV9saW5lYXJfaW5uZXIoZmxvYXQgeCwgdm9pZCogY2xvc3VyZSkgewoJbWFrZV9saW5lYXJfY2xvc3VyZSogY2wgPSBjbG9zdXJlOwoJcmV0dXJuIHgqY2wtPmEgKyBjbC0+YjsKfQoKbGluZWFyX2xhbWJkYSBtYWtlX2xpbmVhcihmbG9hdCBhLCBmbG9hdCBiKSB7CgltYWtlX2xpbmVhcl9jbG9zdXJlKiBjbCA9IG1hbGxvYyhzaXplb2YobWFrZV9saW5lYXJfY2xvc3VyZSkpOwoJY2wtPmEgPSBhOwoJY2wtPmIgPSBiOwoJbGluZWFyX2xhbWJkYSByZXMgPSB7IG1ha2VfbGluZWFyX2lubmVyLCBjbCB9OwoJcmV0dXJuIHJlczsKfQoKCnZvaWQgdGFrZXNfYV9saW5lYXIoZmxvYXQgeCwgbGluZWFyIGxuLCB2b2lkKiBvcGFxdWUpIHsKCWZsb2F0IHAxID0gbG4oeCwgb3BhcXVlKTsKCWZsb2F0IHAyID0gbG4oMip4LCBvcGFxdWUpOwoJcHJpbnRmKCJUd28gcG9pbnRzIG9uIGEgbGluZTogKCVmLCAlZiksICglZiwgJWYpXG4iLCB4LCBwMSwgMip4LCBwMik7Cn0KCgppbnQgbWFpbigpIHsKCWxpbmVhcl9sYW1iZGEgbDEgPSBtYWtlX2xpbmVhcigyLjAsIDEuMCk7CglsaW5lYXJfbGFtYmRhIGwyID0gbWFrZV9saW5lYXIoMi4wLCAzLjApOwoJdGFrZXNfYV9saW5lYXIoMy4wLCBsMS5mdW4sIGwxLmNsb3N1cmUpOwoJdGFrZXNfYV9saW5lYXIoMi4wLCBsMi5mdW4sIGwyLmNsb3N1cmUpOwoJbGluZWFyX2xhbWJkYV9mcmVlKCZsMik7CglsaW5lYXJfbGFtYmRhX2ZyZWUoJmwxKTsKfQo=