variable interpolations
The interpol preprocessor parses Haskell source file before GHC
and performs variable interpolation statically. Concretely, it
replaces {identifier} patterns in literal strings with show identifier. For instance,
okVal = 23
"I have {okVal} apples."
becomes
"I have 23 apples."
This works on any type that has a Show instance and is safe, in the
sense that it does not disable any of GHC's normal checks
(i.e. interpolating a non-existing identifier or one whose type does
not have a Show instance will result in the appropriate error).
This package is on Hackage. To install it, run:
cabal update
cabal install interpol
To use interpol, install the cabal package (and/or make sure that
the interpol executable is in your path), and compile with the "-F -pgmF interpol" GHC options. For instance, one of the tests for this
package is compiled with:
ghc -F -pgmF interpol Test/One.hs
Alternatively, you may specify the options in a GHC_OPTIONS pragma
at the top of the file:
{-# OPTIONS_GHC -F -pgmF interpol #-}
Note that, unless you use this latter pragma,
ghc-mod and other
flymake-based Emacs modes will probably complain about unused
variables.
The interpol preprocessor effectively does two things:
-
it adds an import declaration for
Text.Interpol, in order to bring the(^-^)operator into scope, and -
it replaces any occurrence of
"\\{[A-z_][A-z0-9_]*}"in string literals with"^-^ <ident> ^-^".
So,
"I have {okVal} apples."
actually becomes
("I have " ^-^ okVal ^-^ " apples.")
The (^-^) operator is a smarter version of (++): it shows its
second argument before appending, but only if it is not already a
String (i.e. it does not quote String values when interpolating).
Run the preprocessor manually and check out the source for details (seriously now, this README is longer than the source).