
Graham Klyne
Please, no #ifdef's in standard library code!
Much as we all hate cpp, I'm afraid the standard libraries are already heavily littered with #ifdefs. Getting rid of them is basically impossible.
(a) where possible, use "run-time" tests rather than "compile-time" code selection. If the conditions are constant True or False, surely a compiler should be able to eliminate the redundant code?
Almost never applicable. #ifdefs are generally used to cater for system differences, so more than likely the False branch simply won't compile.
(c) another problem area is where type definitions (incl. function interfaces) differ between systems. Again, eliminating spurious differences would help.
There should be no externally visible type differences in standard libraries. But internal to the library, different systems might indeed use different representations. For an optimising compiler like GHC this is really important, since certain extensions are a big help, but simpler systems like Hugs and nhc98 still need a viable Haskell'98 representation if possible.
(d) For those differences that cannot be eliminated implementing (in Haskell) a portable preprocessor that can ship as part of every Haskell environment?
I think this is ultimately going to be the most viable solution. Let's write a simple 'hspp' (in Haskell?) that is backward compatible with 'cpp -traditional' (although we might also design a newer nicer syntax too), and distribute it with every compiler. It can't be too difficult, surely? Half of the cpp parsing/selection code is already available within hmake. I would take on the project myself, if I had time. Regards, Malcolm