Previous: , Up: Definitions   [Contents][Index]


5.8 Indirect call of builtins

Builtin macros can be called indirectly with builtin:

Builtin: builtin (name, [args…])

Results in a call to the builtin name, which is passed the rest of the arguments args. If name does not name a builtin, an error message is printed, and the expansion is void.

The macro builtin is recognized only with parameters.

This can be used even if name has been given another definition that has covered the original, or been undefined so that no macro maps to the builtin.

pushdef(`define', `hidden')
⇒
undefine(`undefine')
⇒
define(`foo', `bar')
⇒hidden
foo
⇒foo
builtin(`define', `foo', defn(`divnum'))
⇒
foo
⇒0
builtin(`define', `foo', `BAR')
⇒
foo
⇒BAR
undefine(`foo')
⇒undefine(foo)
foo
⇒BAR
builtin(`undefine', `foo')
⇒
foo
⇒foo

The name argument only matches the original name of the builtin, even when the --prefix-builtins option (or -P, see Invoking m4) is in effect. This is different from indir, which only tracks current macro names.

$ m4 -P
m4_builtin(`divnum')
⇒0
m4_builtin(`m4_divnum')
error→m4:stdin:2: undefined builtin `m4_divnum'
⇒
m4_indir(`divnum')
error→m4:stdin:3: undefined macro `divnum'
⇒
m4_indir(`m4_divnum')
⇒0

Note that indir and builtin can be used to invoke builtins without arguments, even when they normally require parameters to be recognized; but it will provoke a warning, and result in a void expansion.

builtin
⇒builtin
builtin()
error→m4:stdin:2: undefined builtin `'
⇒
builtin(`builtin')
error→m4:stdin:3: Warning: too few arguments to builtin `builtin'
⇒
builtin(`builtin',)
error→m4:stdin:4: undefined builtin `'
⇒
builtin(`builtin', ``'
')
error→m4:stdin:5: undefined builtin ``'
error→'
⇒
indir(`index')
error→m4:stdin:7: Warning: too few arguments to builtin `index'
⇒

Previous: , Up: Definitions   [Contents][Index]