// --------------------------------------------------------------------------------
// cps converted, using gcc's lexical functions to handle the free variables.
// --------------------------------------------------------------------------------
typedef int factk (int);
int
ret_cps (int n)
{
return n;
}
int
minus_cps (int a, int b, factk k)
{
return k (a-b);
}
int
mul_cps (int a, int b, factk k)
{
return k (a*b);
}
int
eq_cps (int a, int b, factk k)
{
return k (a==b);
}
int
factcps (int n, factk k)
{
int factcps_1 (int b) {
int factcps_2 (int nm1) {
int factcps_3 (int f) {
return mul_cps (n, f, k);
}
return factcps (nm1, factcps_3);
}
if (b) {
return k (1);
} else {
return minus_cps (n, 1, factcps_2);
}
}
return eq_cps (n, 0, factcps_1);
}
#include <stdio.h>
int
main (int argc, char * argv[])
{
int result = factcps (5, ret_cps);
fprintf (stdout, "factcps(5)==%d\n", result);
return 0;
}