
As you may be aware, GHC's `{-# LANGUAGE CPP #-}` language extension currently relies on the system's C-compiler bundled `cpp` program to provide a "traditional mode" c-preprocessor.
Yes. This is one of my favourite things in GHC-land -- that an existing, good-enough, standardised, and widely-deployed solution was chosen over a NiH reinvention of preprocessing. This allows other Haskell compilers to support CPP on basically any system (since cpp is so standard) without much effort, or even if the compiler does not support {-# LANGUAGE CPP -#} the user can easily run `cpp` over the source files themselves before feeding the source into the compiler. Because it is a real `cpp` being used, the developmer must take care to follow the CPP syntax in the file that will then be transformed into Haskell by `cpp` in the same way that C, C++, and other developers have to take extra care (especially around use of # and end-of-line \) when using `cpp`, but this is the normal state of affairs for a secondary preprocessor step. As a benefit, the source code will be processable by standard `cpp` implementations available for virtually every platform. In short, the current solution provides a very robust and portable way to do pre-compile preprocessing, and I like it very much.