fork download
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3.  
  4.  
  5. typedef float (*linear)(float, void* closure);
  6.  
  7.  
  8. typedef struct {
  9. linear fun;
  10. void* closure;
  11. } linear_lambda;
  12.  
  13. void linear_lambda_free(linear_lambda* ln) {
  14. free(ln->closure);
  15. }
  16.  
  17.  
  18. typedef struct {
  19. float a;
  20. float b;
  21. } make_linear_closure;
  22.  
  23. static float make_linear_inner(float x, void* closure) {
  24. make_linear_closure* cl = closure;
  25. return x*cl->a + cl->b;
  26. }
  27.  
  28. linear_lambda make_linear(float a, float b) {
  29. make_linear_closure* cl = malloc(sizeof(make_linear_closure));
  30. cl->a = a;
  31. cl->b = b;
  32. linear_lambda res = { make_linear_inner, cl };
  33. return res;
  34. }
  35.  
  36.  
  37. void takes_a_linear(float x, linear ln, void* opaque) {
  38. float p1 = ln(x, opaque);
  39. float p2 = ln(2*x, opaque);
  40. printf("Two points on a line: (%f, %f), (%f, %f)\n", x, p1, 2*x, p2);
  41. }
  42.  
  43.  
  44. int main() {
  45. linear_lambda l1 = make_linear(2.0, 1.0);
  46. linear_lambda l2 = make_linear(2.0, 3.0);
  47. takes_a_linear(3.0, l1.fun, l1.closure);
  48. takes_a_linear(2.0, l2.fun, l2.closure);
  49. linear_lambda_free(&l2);
  50. linear_lambda_free(&l1);
  51. }
  52.  
Success #stdin #stdout 0s 9424KB
stdin
Standard input is empty
stdout
Two points on a line: (3.000000, 7.000000), (6.000000, 13.000000)
Two points on a line: (2.000000, 7.000000), (4.000000, 11.000000)