
On 10/06/2015 02:40 AM, Gregory Collins wrote:
On Mon, Oct 5, 2015 at 3:18 PM, Bryan Richter wrote:
Hang on a moment, are you saying that all the people writing to argue that these changes would require them to write dozens more #ifdef's actually don't have to write any at all?
Um, no, it usually isn't anything like that. Here's a sampling of some of the things I've used CPP for in the past few years:
- After GHC 7.4, when using a newtype in FFI imports you need to import the constructor, i.e. "import Foreign.C.Types(CInt(..))" --- afaik CPP is the only way to shut up warnings everywhere
Having code meant for 4 different versions of a compiler be completely -Wall clean is not a reasonable goal. This doesn't even happen for C++ compilers! (If my experience is anything to go by.) It's also the reason -Werror is forbidden in Hackage uploads. (At least, I think it is. Isn't it?) Also, GHC 7.4 was released 2½ years ago. You may have my sympathies for trying to support it, but unless you're getting paid for it I don't think it's reasonable to expect you to. (If you're getting paid, then I don't understand the complaint -- it might be a bit of make-work, but I think everybody is subjected to that.)
- defaultTimeLocale moved from System.Locale to Data.Time.Format in time-1.5 (no compat package for this, afaik)
"time-locale-compat" as Ivan pointed out.
- one of many various changes to Typeable in the GHC 7.* series (deriving works better now, mkTyCon vs mkTyCon3, etc)
I think these were because people learned that they could be done better? (Also, I believe there was something here about these changes being necessary for Safe Haskell, namely forbidding user-written instances?) Is Typeable part of Haskell 2010?
- Do I have to hide "catch" from Prelude, or not? It got moved, and "hiding" gives an error if the symbol you're trying to hide is missing. Time to break out the CPP (and curse myself for not just using the qualified import in the first place)
Could you solve it with a qualified import? Then why use CPP? (Incidentally, I think this is evidence that the Prelude should be an explicit import like in PureScript.)
- Do I get monoid functions from Prelude or from Data.Monoid? Same w/ Applicative, Foldable, Word. I don't know where anything is supposed to live anymore, or which sequence of imports will shut up spurious warnings on all four versions of GHC I support, so the lowest-friction fix is: break out the #ifdef spackle
You don't *have* to shut up all warnings. (Unless we're talking deprecation warnings *and* you're getting close to the cutoff point.)
- ==# and friends return Int# instead of Bool after GHC 7.8.1
Hoogle find ==# (and I've never heard it of before).
- To use functions like "tryReadMVar", "unsafeShiftR", and "atomicModifyIORef'" that are in recent base versions but not older ones (this is a place where CPP use is actually justified)
Well, yeah, new functions don't magically appear in old versions. I don't anybody expects that :). Regards,