/usr/share/doc/m4-doc/Pseudo-Arguments.html is in m4-doc 1.4.18-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 | <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!--
This manual (31 December 2016) is for GNU M4 (version
1.4.18), a package containing an implementation of the m4 macro
language.
Copyright (C) 1989-1994, 2004-2014, 2016 Free Software
Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License,
Version 1.3 or any later version published by the Free Software
Foundation; with no Invariant Sections, no Front-Cover Texts, and no
Back-Cover Texts. A copy of the license is included in the section
entitled "GNU Free Documentation License." -->
<!-- Created by GNU Texinfo 6.3, http://www.gnu.org/software/texinfo/ -->
<head>
<title>GNU M4 1.4.18 macro processor: Pseudo Arguments</title>
<meta name="description" content="GNU M4 1.4.18 macro processor: Pseudo Arguments">
<meta name="keywords" content="GNU M4 1.4.18 macro processor: Pseudo Arguments">
<meta name="resource-type" content="document">
<meta name="distribution" content="global">
<meta name="Generator" content="makeinfo">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link href="index.html#Top" rel="start" title="Top">
<link href="Indices.html#Indices" rel="index" title="Indices">
<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
<link href="Definitions.html#Definitions" rel="up" title="Definitions">
<link href="Undefine.html#Undefine" rel="next" title="Undefine">
<link href="Arguments.html#Arguments" rel="prev" title="Arguments">
<style type="text/css">
<!--
a.summary-letter {text-decoration: none}
blockquote.indentedblock {margin-right: 0em}
blockquote.smallindentedblock {margin-right: 0em; font-size: smaller}
blockquote.smallquotation {font-size: smaller}
div.display {margin-left: 3.2em}
div.example {margin-left: 3.2em}
div.lisp {margin-left: 3.2em}
div.smalldisplay {margin-left: 3.2em}
div.smallexample {margin-left: 3.2em}
div.smalllisp {margin-left: 3.2em}
kbd {font-style: oblique}
pre.display {font-family: inherit}
pre.format {font-family: inherit}
pre.menu-comment {font-family: serif}
pre.menu-preformatted {font-family: serif}
pre.smalldisplay {font-family: inherit; font-size: smaller}
pre.smallexample {font-size: smaller}
pre.smallformat {font-family: inherit; font-size: smaller}
pre.smalllisp {font-size: smaller}
span.nolinebreak {white-space: nowrap}
span.roman {font-family: initial; font-weight: normal}
span.sansserif {font-family: sans-serif; font-weight: normal}
ul.no-bullet {list-style: none}
-->
</style>
</head>
<body lang="en">
<a name="Pseudo-Arguments"></a>
<div class="header">
<p>
Next: <a href="Undefine.html#Undefine" accesskey="n" rel="next">Undefine</a>, Previous: <a href="Arguments.html#Arguments" accesskey="p" rel="prev">Arguments</a>, Up: <a href="Definitions.html#Definitions" accesskey="u" rel="up">Definitions</a> [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Indices.html#Indices" title="Index" rel="index">Index</a>]</p>
</div>
<hr>
<a name="Special-arguments-to-macros"></a>
<h3 class="section">5.3 Special arguments to macros</h3>
<a name="index-special-arguments-to-macros"></a>
<a name="index-macros_002c-special-arguments-to"></a>
<a name="index-arguments-to-macros_002c-special"></a>
<p>There is a special notation for the number of actual arguments supplied,
and for all the actual arguments.
</p>
<p>The number of actual arguments in a macro call is denoted by <code>$#</code>
in the expansion text.
</p>
<dl>
<dt><a name="index-nargs"></a>Composite: <strong>nargs</strong> <em>(…)</em></dt>
<dd><p>Expands to a count of the number of arguments supplied.
</p></dd></dl>
<div class="example">
<pre class="example">define(`nargs', `$#')
⇒
nargs
⇒0
nargs()
⇒1
nargs(`arg1', `arg2', `arg3')
⇒3
nargs(`commas can be quoted, like this')
⇒1
nargs(arg1#inside comments, commas do not separate arguments
still arg1)
⇒1
nargs((unquoted parentheses, like this, group arguments))
⇒1
</pre></div>
<p>Remember that ‘<samp>#</samp>’ defaults to the comment character; if you forget
quotes to inhibit the comment behavior, your macro definition may not
end where you expected.
</p>
<div class="example">
<pre class="example">dnl Attempt to define a macro to just `$#'
define(underquoted, $#)
oops)
⇒
underquoted
⇒0)
⇒oops
</pre></div>
<p>The notation <code>$*</code> can be used in the expansion text to denote all
the actual arguments, unquoted, with commas in between. For example
</p>
<div class="example">
<pre class="example">define(`echo', `$*')
⇒
echo(arg1, arg2, arg3 , arg4)
⇒arg1,arg2,arg3 ,arg4
</pre></div>
<p>Often each argument should be quoted, and the notation <code>$@</code> handles
that. It is just like <code>$*</code>, except that it quotes each argument.
A simple example of that is:
</p>
<div class="example">
<pre class="example">define(`echo', `$@')
⇒
echo(arg1, arg2, arg3 , arg4)
⇒arg1,arg2,arg3 ,arg4
</pre></div>
<p>Where did the quotes go? Of course, they were eaten, when the expanded
text were reread by <code>m4</code>. To show the difference, try
</p>
<div class="example">
<pre class="example">define(`echo1', `$*')
⇒
define(`echo2', `$@')
⇒
define(`foo', `This is macro `foo'.')
⇒
echo1(foo)
⇒This is macro This is macro foo..
echo1(`foo')
⇒This is macro foo.
echo2(foo)
⇒This is macro foo.
echo2(`foo')
⇒foo
</pre></div>
<p>See <a href="Trace.html#Trace">Trace</a>, if you do not understand this. As another example of the
difference, remember that comments encountered in arguments are passed
untouched to the macro, and that quoting disables comments.
</p>
<div class="example">
<pre class="example">define(`echo1', `$*')
⇒
define(`echo2', `$@')
⇒
define(`foo', `bar')
⇒
echo1(#foo'foo
foo)
⇒#foo'foo
⇒bar
echo2(#foo'foo
foo)
⇒#foobar
⇒bar'
</pre></div>
<p>A ‘<samp>$</samp>’ sign in the expansion text, that is not followed by anything
<code>m4</code> understands, is simply copied to the macro expansion, as any
other text is.
</p>
<div class="example">
<pre class="example">define(`foo', `$$$ hello $$$')
⇒
foo
⇒$$$ hello $$$
</pre></div>
<a name="index-rescanning-2"></a>
<a name="index-literal-output"></a>
<a name="index-output_002c-literal"></a>
<p>If you want a macro to expand to something like ‘<samp>$12</samp>’, the
judicious use of nested quoting can put a safe character between the
<code>$</code> and the next character, relying on the rescanning to remove the
nested quote. This will prevent <code>m4</code> from interpreting the
<code>$</code> sign as a reference to an argument.
</p>
<div class="example">
<pre class="example">define(`foo', `no nested quote: $1')
⇒
foo(`arg')
⇒no nested quote: arg
define(`foo', `nested quote around $: `$'1')
⇒
foo(`arg')
⇒nested quote around $: $1
define(`foo', `nested empty quote after $: $`'1')
⇒
foo(`arg')
⇒nested empty quote after $: $1
define(`foo', `nested quote around next character: $`1'')
⇒
foo(`arg')
⇒nested quote around next character: $1
define(`foo', `nested quote around both: `$1'')
⇒
foo(`arg')
⇒nested quote around both: arg
</pre></div>
<hr>
<div class="header">
<p>
Next: <a href="Undefine.html#Undefine" accesskey="n" rel="next">Undefine</a>, Previous: <a href="Arguments.html#Arguments" accesskey="p" rel="prev">Arguments</a>, Up: <a href="Definitions.html#Definitions" accesskey="u" rel="up">Definitions</a> [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Indices.html#Indices" title="Index" rel="index">Index</a>]</p>
</div>
</body>
</html>
|