MyNixOS website logo
Description

GHC preprocessor and library to enable variable interpolation in strings.

This preprocessor enables variable interpolation in strings. Alternatively, the library may be used.

See the README.md file for details.

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

Note that, unless you use this latter pragma, ghc-mod and other flymake-based Emacs modes will probably complain about unused variables.

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

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

Metadata

Version

0.2.3

Platforms (75)

    Darwin
    FreeBSD
    Genode
    GHCJS
    Linux
    MMIXware
    NetBSD
    none
    OpenBSD
    Redox
    Solaris
    WASI
    Windows
Show all
  • aarch64-darwin
  • aarch64-genode
  • aarch64-linux
  • aarch64-netbsd
  • aarch64-none
  • aarch64_be-none
  • arm-none
  • armv5tel-linux
  • armv6l-linux
  • armv6l-netbsd
  • armv6l-none
  • armv7a-darwin
  • armv7a-linux
  • armv7a-netbsd
  • armv7l-linux
  • armv7l-netbsd
  • avr-none
  • i686-cygwin
  • i686-darwin
  • i686-freebsd
  • i686-genode
  • i686-linux
  • i686-netbsd
  • i686-none
  • i686-openbsd
  • i686-windows
  • javascript-ghcjs
  • loongarch64-linux
  • m68k-linux
  • m68k-netbsd
  • m68k-none
  • microblaze-linux
  • microblaze-none
  • microblazeel-linux
  • microblazeel-none
  • mips-linux
  • mips-none
  • mips64-linux
  • mips64-none
  • mips64el-linux
  • mipsel-linux
  • mipsel-netbsd
  • mmix-mmixware
  • msp430-none
  • or1k-none
  • powerpc-netbsd
  • powerpc-none
  • powerpc64-linux
  • powerpc64le-linux
  • powerpcle-none
  • riscv32-linux
  • riscv32-netbsd
  • riscv32-none
  • riscv64-linux
  • riscv64-netbsd
  • riscv64-none
  • rx-none
  • s390-linux
  • s390-none
  • s390x-linux
  • s390x-none
  • vc4-none
  • wasm32-wasi
  • wasm64-wasi
  • x86_64-cygwin
  • x86_64-darwin
  • x86_64-freebsd
  • x86_64-genode
  • x86_64-linux
  • x86_64-netbsd
  • x86_64-none
  • x86_64-openbsd
  • x86_64-redox
  • x86_64-solaris
  • x86_64-windows