Let me show you an example to prove it. The example is limited to composition of unary functions defined on int u::Int->Int v::Int->Int o ::(Int->Int)->(Int->Int)->(Int->Int) o u v= \x->u(v(x)) #include <stdio.h> #include <conio.h> #include "functional.h" int f1(int x){ return x+x; } int f2(int x){ return 2*x; } int g1(int x){ return x+1; } int g2(int x){ return x-1; } #define P1 P0 int main(){ #define P2 P1 printf("%d,%d,%d\n",2, #define P3 O(f1,f2,P2)(2), #define P4 O(g1,g2,P3)(3)); #define P5 P4 getch(); #define P6 P5 } MAIN P6 Here is the file functional.h #define FUNC2(x,y) x##y #define FUNC1(x,y) FUNC2(x,y) #define FUNC(x) FUNC1(x,__COUNTER__) #define COMP(c,f,g,p) \ int c (int x) { return f(g(x)); }; \ p \ c #define O(f,g,p) COMP( FUNC(a), f, g, p) #define P0 #define MAIN