On Fri, Aug 11, 2017 at 11:25 AM, Baa <aquagnu@gmail.com> wrote:
I have code (this is the fragment only):

  {-# LANGUAGE CPP                 #-}
  ...
  ...
    let user' = ...
    ...
    else defect $ logger # ("authentication failure (user: " ++ user' ++ ")") #: __LINE__
    ...
  ...

and I get compilation error:

        • Found hole: __LINE__ :: Int
          Or perhaps ‘__LINE__’ is mis-spelled, or not in scope

You do understand that CPP refers to the C preprocessor, correct?

Or perhaps it is C syntax that you are unaware of.

Haskell does not get to tell a C preprocessor to follow Haskell rules instead of C rules. In the referenced chunk, there are two things that can cause problems: the single quote, which in the C preprocessor begins a string-like entity (character literal.. for historical reasons, C (char) literals can have multiple characters!), and the # which in mid-line indicates a token pasting operation of some kind.

And in this particular case, the #s probably just got eaten, and the ' means the following __LINE__ was in what the C preprocessor thought was a long (char) constant and therefore did not get expanded. Since it has a leading underscore in its name, and is not known to be bound *at the Haskell level*, it is interpreted as a hole.

If you are using LANGUAGE CPP, you must avoid Haskell syntax that is not also valid C tokens. This is the downside of using a tool intended for a different language with different syntax rules.

--
brandon s allbery kf8nh                               sine nomine associates
allbery.b@gmail.com                                  ballbery@sinenomine.net
unix, openafs, kerberos, infrastructure, xmonad        http://sinenomine.net