GNU Info

Info Node: (autoconf.info)Changequote is Evil

(autoconf.info)Changequote is Evil


Next: Quadrigraphs Prev: Quotation and Nested Macros Up: M4 Quotation
Enter node , (file) or (file)node

`changequote' is Evil
---------------------

   The temptation is often high to bypass proper quotation, in
particular when it's late at night.  Then, many experienced Autoconf
hackers finally surrender to the dark side of the force and use the
ultimate weapon: `changequote'.

   The M4 builtin `changequote' belongs to a set of primitives that
allow one to adjust the syntax of the language to adjust it to her
needs.  For instance, by default M4 uses ``' and `'' as quotes, but in
the context of shell programming (and actually of most programming
languages), it's about the worst choice one can make: because of
strings and back quoted expression in shell (such as `'this'' and
``that`'), because of literal characters in usual programming language
(as in `'0''), there are many unbalanced ``' and `''.  Proper M4
quotation then becomes a nightmare, if not impossible.  In order to
make M4 useful in such a context, its designers have equipped it with
`changequote', which makes it possible to chose another pair of quotes.
M4sugar, M4sh, Autoconf, and Autotest all have chosen to use `[' and
`]'.  Not especially because they are unlikely characters, but _because
they are characters unlikely to be unbalanced_.

   There are other magic primitives, such as `changecom' to specify
what syntactic forms are comments (it is common to see `changecom(<!--,
-->)' when M4 is used to produce HTML pages), `changeword' and
`changesyntax' to change other syntactic details (such as the character
to denote the n-th argument, `$' by default, the parenthesis around
arguments etc.).

   These primitives are really meant to make M4 more useful for specific
domains: they should be considered like command line options:
`--quotes', `--comments', `--words', and `--syntax'.  Nevertheless,
they are implemented as M4 builtins, as it makes M4 libraries self
contained (no need for additional options).

   There lies the problem...


   The problem is that it is then tempting to use them in the middle of
an M4 script, as opposed to its initialization.  This, if not carefully
thought, can lead to disastrous effects: _you are changing the language
in the middle of the execution_.  Changing and restoring the syntax is
often not enough: if you happened to invoke macros in between, these
macros will be lost, as the current syntax will probably not be the one
they were implemented with.


automatically generated by info2www version 1.2.2.9