manpagez: man pages & more
info autoconf
Home | html | info | man

File: autoconf.info,  Node: One Macro Call,  Next: Quoting and Parameters,  Prev: Active Characters,  Up: M4 Quotation

8.1.2 One Macro Call
--------------------

Let's proceed on the interaction between active characters and macros
with this small macro, which just returns its first argument:

     define([car], [$1])

The two pairs of quotes above are not part of the arguments of ‘define’;
rather, they are understood by the top level when it tries to find the
arguments of ‘define’.  Therefore, assuming ‘car’ is not already
defined, it is equivalent to write:

     define(car, $1)

But, while it is acceptable for a ‘configure.ac’ to avoid unnecessary
quotes, it is bad practice for Autoconf macros which must both be more
robust and also advocate perfect style.

   At the top level, there are only two possibilities: either you quote
or you don't:

     car(foo, bar, baz)
     ⇒foo
     [car(foo, bar, baz)]
     ⇒car(foo, bar, baz)

   Let's pay attention to the special characters:

     car(#)
     error→EOF in argument list

   The closing parenthesis is hidden in the comment; with a hypothetical
quoting, the top level understood it this way:

     car([#)]

Proper quotation, of course, fixes the problem:

     car([#])
     ⇒#

   Here are more examples:

     car(foo, bar)
     ⇒foo
     car([foo, bar])
     ⇒foo, bar
     car((foo, bar))
     ⇒(foo, bar)
     car([(foo], [bar)])
     ⇒(foo
     define([a], [b])
     ⇒
     car(a)
     ⇒b
     car([a])
     ⇒b
     car([[a]])
     ⇒a
     car([[[a]]])
     ⇒[a]

© manpagez.com 2000-2025
Individual documents may contain additional copyright information.