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