[Haskell-cafe] Where is the hole?
Brandon Allbery
allbery.b at gmail.com
Fri Aug 11 15:39:43 UTC 2017
On Fri, Aug 11, 2017 at 11:25 AM, Baa <aquagnu at 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 at gmail.com ballbery at sinenomine.net
unix, openafs, kerberos, infrastructure, xmonad http://sinenomine.net
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20170811/737492c9/attachment.html>
More information about the Haskell-Cafe
mailing list