#include <perms.h>
// Edinburgh IMP77 Compiler - Version 8.4
//
// 1 %begin
int main(int argc, char **argv) { /*%begin*/
_imp_initialise(argc, argv);
auto void DO(float BEFORE, int (*FN)(int P, int Q), unsigned char AFTER);
// 2 %routinespec do(%real before, %integerfn fn(%integer p,q), %byteinteger after)
// 3
// 4 %integerfn sum(%integer a,b)
int SUM(int A, int B) {
// 5 %result = a+b
return A + B;
// 6 %end
} /* end of SUM */
// 7
// 8 do(3.14, sum, 240)
DO(3.14, SUM, 240);
// 9
// 10 %routine do(%real before, %integerfn fn(%integer p,q), %byteinteger after)
void DO(float BEFORE, int (*FN)(int P, int Q), unsigned char AFTER) {
// 11 %integer i
int I;
// 12 i = fn(1,2)
I = FN(1, 2);
// 13 write(i, -1); newline
_imp_WRITE(I, -1);
_imp_NEWLINE();
// 14 %end
return;
} /* end of DO */
// ?AFTER unused
// ?BEFORE unused
// 15
// 16 %endofprogram
_imp_stop(0);
return 0;
end_0:;
}