// --------------------------------------------------------------------------------
// simplified (inlining operators)
// --------------------------------------------------------------------------------
typedef int factk (int);
int
ret_cps (int n)
{
return n;
}
#if 0
// step one: inline eq_cps
int
factcps (int n, factk k)
{
int factcps_2 (int nm1) {
int factcps_3 (int f) {
return mul_cps (n, f, k);
}
return factcps (nm1, factcps_3);
}
if (n == 0) {
return k (1);
} else {
return minus_cps (n, 1, factcps_2);
}
}
// step two: inline minus_cps
int
factcps (int n, factk k)
{
int factcps_3 (int f) {
return mul_cps (n, f, k);
}
if (n == 0) {
return k (1);
} else {
return factcps (n-1, factcps_3);
}
}
#endif
// step three: inline mul_cps
int
factcps (int n, factk k)
{
int factcps_3 (int f) {
return k (n * f);
}
if (n == 0) {
return k (1);
} else {
return factcps (n-1, factcps_3);
}
}
#include <stdio.h>
int
main (int argc, char * argv[])
{
int result = factcps (5, ret_cps);
fprintf (stdout, "factcps(5)==%d\n", result);
return 0;
}