Substitution Expressions (subex)
================================

A *subex* (*Substitution Expression*) represents an advanced string
substitution. In contrast to a `regex`:idx: which deals with string analysis, a
*subex* deals with string synthesis.

Thanks to its conditional construct ``$[0|1|2|else]`` it supports
`internationalization`:idx: of format string literals quite well.


=====================   =====================================================
Notation                meaning
=====================   =====================================================
``$#``                  use first or next argument
``$name``               use named argument, you can wrap the named argument
                        in curly braces (eg. ``${name}``) to separate it from
                        the next characters.
``$$``                  produces a single ``$``
``$1``                  use first argument
``$-1``                 use last argument
``${1..3}``             use arguments 1 to 3
``${..}``               use all arguments
``$*``                  use all arguments (same as ``${..}``)
``${#..}``              use all remaining arguments
``${..-2}``             use all arguments except the last argument
``${$1}``               use argument X where ``X = parseInt(arg[1])``
``${$1..$2}``           use arguments X to Y where ``X = parseInt(arg[1])``
                        and ``Y = parseInt(arg[2])``
``$','{1..3}``          use arguments 1 to 3 and join them with ','
``$','80c'\n'{..}``     use all arguments, join them with ','. Insert '\\n'
                        before the resulting string exceeds 80 chars.
``$','8i'\n'{..}``      use all arguments, join them with ','. Insert '\\n'
                        after every 8th item.
``$' '~{1..3}``         use arguments 1 to 3 with a leading space if the
                        concatenation of ``1..3`` is not the empty string
``$[zero|one|def]1``    use ``X = parseInt(arg[1])`` to determine which
                        branch to use. If ``X == 0`` the 'zero' branch is
                        selected, if ``X == 1`` the 'one' branch is
                        selected, etc. Otherwise the 'def' branch is
                        selected. ``$x`` is interpreted in branches too.
                        If a branch needs to contain ``|``, ``]`` put
                        them in single quotes. To produce a verbatim single
                        quote, use ``''``.
=====================   =====================================================

Examples
========

.. code-block:: nim

  subex"$1($', '{2..})" % ["f", "a", "b", "c"] == "f(a, b, c)"

  subex"$1 $[files|file|files]{1} copied" % ["1"] == "1 file copied"

  subex"$['''|'|''''|']']#" % "0" == "'|"

  subex("type\n  TEnum = enum\n    $', '40c'\n    '{..}") % [
    "fieldNameA", "fieldNameB", "fieldNameC", "fieldNameD"]


