I wonder how much of the CPP functionality could be implemented using template haskell?