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