// Program: sigma_i=1^10(i**2)
// i.e. Calculate 1*1 + 2*2 + 3*3 + ... + 10*10 = 385 
/*
'begin'
    'comment'
         Example of call by name.
    ;

    'integer' 'array' data [1:10];
    'integer' i;
    'integer' sum;

    'integer' 'procedure' GPS(I, N, Z, V);
    'integer' I, N, Z, V;
    'begin'
    'for' I := 1 'step' 1 'until' N 'do'
            Z := V;
        GPS := 1
    'end';

    'for' i := 1 'step' 1 'until' 10 'do'
        data[i] := i * i;
    sum := 0;
    GPS(i, 10, sum, sum + data[i]);
    vprint("Result is ", sum)
'end'

*/

#include <stdio.h>
#define _I(expr) ({ int *_thunk(void){ static int _i; _i = expr; return &_i; }; &_thunk; })
#define _IV(var) ({ int *_thunk(void){ return &var; }; &_thunk; })
int main(int argc, char **argv)
{
  int data[11];
  int i, sum;

  int gps(int *i(void), int *n(void), int *z(void), int *v(void)) {
# define I (*i())
# define N (*n())
# define Z (*z())
# define V (*v())
    for (I = 1; I <= N; I += 1) {
      Z = V;
    }
    return 1;
#undef V
#undef Z
#undef N
#undef I
  }

  for (i = 1; i <= 10; i += 1)
      data[i] = i * i;
  sum = 0;

  gps(_IV(i), _I(10), _IV(sum), _I(sum + data[i]));

  printf("Result is %d\n", sum);  
  fflush(stdout);
  return(0);
}