This programming language may be used to instruct a computer to perform a task.
m4 reads text input, expands macros in the text, and prints the result. It can be used as a front-end to a compiler or assembler, or for general purpose expanding etc.
Various builtin macros can do integer arithmetic, run shell commands, access files, divert output to temporary buffers for re-ordering, etc.
define creates new macros.
<lang m4>define(`foo', `blah blah: $1') foo(123) => blah blah: 123</lang>
Control flow is limited to
ifelse, but it's easy to construct loops by recursion. GNU m4 includes examples of macros implementing various general-purpose loops.
Quoting data values against premature or unwanted expansion can be a little tricky. The default quote characters are
'. If they would occur in text too often then
changequote() can set something else. Autoconf changes to
' occur often in its Bourne Shell output.
When a macro expands, its value (with
$1 etc parameters substituted) is re-read as input. This is how macro definitions can contain further macros to expand.
<lang m4>define(`foo', `bar(`$1',x,`$2')')</lang>
Various m4 implementations, including BSD, have a fixed limit on the amount "push-back" text to be re-read. GNU m4 has no limit except available memory. A limit restricts the size of macro values and the data they might operate on. Cutting data into pieces can keep expansions to a reasonable size.
The simple text re-reading means that macro calls are "properly tail recursive". If an expansion ends with another macro call then that call can re-expand recursively or by co-routining endlessly. But a tail call must be the very last thing, no newline or other fixed text after. See Factorial for an example of such recursion.
One implementation of this Unix macro processor m4 is the GNU m4
This category has the following 2 subcategories, out of 2 total.
Pages in category "M4"
The following 92 pages are in this category, out of 92 total.