packages feed

interpol-0.2.0: README.md

interpol
========

> variable interpolations


Examples
--------

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).


Installation
------------

This package is on
[Hackage](http://hackage.haskell.org/package/interpol).  To install
it, run:

    cabal update
    cabal install interpol


Usage
-----

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 #-}


Operation
---------

The `interpol` preprocessor effectively does two things:

 1. it adds an import declaration for `Text.Interpol`, in order to
     bring the `(^-^)` operator into scope, and

 1. 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).