// 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
}