Rightly or wrongly, the C pre-processor is widely used in Haskell
source code. It enables conditional compilation for different
compilers, different versions of the same compiler, and different OS
platforms. It is also occasionally used for its macro language, which
can enable certain forms of platform-specific detail-filling, such as
the tedious boilerplate generation of instance definitions and FFI
declarations. However, there are two problems with cpp, aside from the
obvious aesthetic ones:

  * For some Haskell systems, notably Hugs on Windows, a true cpp is
    not available by default.
  * Even for the other Haskell systems, the common cpp provided by the
    gcc 3.x series is changing subtly in ways that are incompatible
    with Haskell's syntax. There have always been problems with, for
    instance, string gaps, and prime characters in identifiers. These
    problems are only going to get worse.

So, it seemed right to attempt to provide an alternative to cpp, both
more compatible with Haskell, and itself written in Haskell so that it
can be distributed with compilers. This version of the C pre-processor
is pretty-much feature-complete, and compatible with the -traditional
style.
