Next: Arguments Up: Definitions
5.1 Defining a macro
The normal way to define or redefine macros is to use the builtin
-- Builtin: define (NAME, [EXPANSION])
Defines NAME to expand to EXPANSION. If EXPANSION is not given,
it is taken to be empty.
The expansion of `define' is void. The macro `define' is
recognized only with parameters.
The following example defines the macro FOO to expand to the text
define(`foo', `Hello world.')
The empty line in the output is there because the newline is not a
part of the macro definition, and it is consequently copied to the
output. This can be avoided by use of the macro `dnl'. Note: Dnl,
The first argument to `define' should be quoted; otherwise, if the
macro is already defined, you will be defining a different macro. This
example shows the problems with underquoting, since we did not want to
GNU `m4' normally replaces only the _topmost_ definition of a macro
if it has several definitions from `pushdef' (Note: Pushdef). Some
other implementations of `m4' replace all definitions of a macro with
`define'. Note: Incompatibilities, for more details.
As a GNU extension, the first argument to `define' does not have to
be a simple word. It can be any text string, even the empty string. A
macro with a non-standard name cannot be invoked in the normal way, as
the name is not recognized. It can only be referenced by the builtins
`indir' (Note: Indir) and `defn' (Note: Defn).
Arrays and associative arrays can be simulated by using non-standard
-- Composite: array (INDEX)
-- Composite: array_set (INDEX, [VALUE])
Provide access to entries within an array. `array' reads the entry
at location INDEX, and `array_set' assigns VALUE to location INDEX.
define(`array', `defn(format(``array[%d]'', `$1'))')
define(`array_set', `define(format(``array[%d]'', `$1'), `$2')')
array_set(`4', `array element no. 4')
array_set(`17', `array element no. 17')
=>array element no. 4
array(eval(`10 + 7'))
=>array element no. 17
Change the `%d' to `%s' and it is an associative array.
automatically generated by info2www