// Program Man or Boy /* 'begin' 'real' 'procedure' A (k, x1, x2, x3, x4, x5); 'value' k; 'integer' k; 'begin' 'real' 'procedure' B; 'begin' k:= k - 1; B:= A := A (k, B, x1, x2, x3, x4); 'end'; 'if' k <= 0 'then' A:= x4 + x5 'else' B; 'end'; outreal (A (10, 1, -1, -1, 1, 0)); 'end'; */ #include <stdio.h> int main(int argc, char **argv) { #define _F(expr) ({ float *_thunk(void){ static float _f; _f = expr; return &_f; }; &_thunk; }) #define _FV(var) ({ float *_thunk(void){ return &var; }; &_thunk; }) float *a(int k, float *x1(void), float *x2(void), float *x3(void), float *x4(void), float *x5(void)) { # define A(k,x1,x2,x3,x4,x5) (*a(k,x1,x2,x3,x4,x5)) # define X1 (*x1()) # define X2 (*x2()) # define X3 (*x3()) # define X4 (*x4()) # define X5 (*x5()) static float A_result; float *b(void) { # define B (*b()) static float B_result; k = k - 1; B_result = A_result = A(k, _F(B), _FV(X1), _FV(X2), _FV(X3), _FV(X4)); return &B_result; } if (k <= 0) A_result = X4 + X5; else (void)B; return &A_result; #undef B #undef X5 #undef X4 #undef X3 #undef X2 #undef X1 } printf("%f\n", A(10, _F(1.0), _F(-1.0), _F(-1.0), _F(1.0), _F(0.0))); fflush(stdout); return(0); #undef A }