(m4.info.gz) Ifelse
Info Catalog
(m4.info.gz) Ifdef
(m4.info.gz) Conditionals
(m4.info.gz) Loops
5.2 If-else construct, or multibranch
=====================================
The other conditional, `ifelse', is much more powerful. It can be used
as a way to introduce a long comment, as an if-else construct, or as a
multibranch, depending on the number of arguments supplied:
-- Builtin: ifelse (COMMENT)
-- Builtin: ifelse (STRING-1, STRING-2, EQUAL, [NOT-EQUAL])
-- Builtin: ifelse (STRING-1, STRING-2, EQUAL-1, STRING-3, STRING-4,
EQUAL-2, ...)
Used with only one argument, the `ifelse' simply discards it and
produces no output.
If called with three or four arguments, `ifelse' expands into
EQUAL, if STRING-1 and STRING-2 are equal (character for
character), otherwise it expands to NOT-EQUAL. A final fifth
argument is ignored, after triggering a warning.
If called with six or more arguments, and STRING-1 and STRING-2
are equal, `ifelse' expands into EQUAL-1, otherwise the first
three arguments are discarded and the processing starts again.
The macro `ifelse' is recognized only with parameters.
Using only one argument is a common `m4' idiom for introducing a
block comment, as an alternative to repeatedly using `dnl'. This
special usage is recognized by GNU `m4', so that in this case, the
warning about missing arguments is never triggered.
ifelse(`some comments')
=>
ifelse(`foo', `bar')
error-->m4:stdin:2: Warning: too few arguments to builtin `ifelse'
=>
Using three or four arguments provides decision points.
ifelse(`foo', `bar', `true')
=>
ifelse(`foo', `foo', `true')
=>true
define(`foo', `bar')
=>
ifelse(foo, `bar', `true', `false')
=>true
ifelse(foo, `foo', `true', `false')
=>false
Notice how the first argument was used unquoted; it is common to
compare the expansion of a macro with a string. With this macro, you
can now reproduce the behavior of many of the builtins, where the macro
is recognized only with arguments.
define(`foo', `ifelse(`$#', `0', ``$0'', `arguments:$#')')
=>
foo
=>foo
foo()
=>arguments:1
foo(`a', `b', `c')
=>arguments:3
However, `ifelse' can take more than four arguments. If given more
than four arguments, `ifelse' works like a `case' or `switch' statement
in traditional programming languages. If STRING-1 and STRING-2 are
equal, `ifelse' expands into EQUAL-1, otherwise the procedure is
repeated with the first three arguments discarded. This calls for an
example:
ifelse(`foo', `bar', `third', `gnu', `gnats')
error-->m4:stdin:1: Warning: excess arguments to builtin `ifelse' ignored
=>gnu
ifelse(`foo', `bar', `third', `gnu', `gnats', `sixth')
=>
ifelse(`foo', `bar', `third', `gnu', `gnats', `sixth', `seventh')
=>seventh
ifelse(`foo', `bar', `3', `gnu', `gnats', `6', `7', `8')
error-->m4:stdin:4: Warning: excess arguments to builtin `ifelse' ignored
=>7
Naturally, the normal case will be slightly more advanced than these
examples. A common use of `ifelse' is in macros implementing loops of
various kinds.
Info Catalog
(m4.info.gz) Ifdef
(m4.info.gz) Conditionals
(m4.info.gz) Loops
automatically generated byinfo2html