与えられた実引数(actual arguments)の個数や全ての実引数をまとめて表すための 特別な表記方法があります。
マクロを呼び出すときに与えられた実引数の個数は、
展開用テキストの中で$#
として表します。
したがって与えられた実引数の個数を表示するマクロは次のようになります。
define(`nargs', `$#') ⇒ nargs ⇒0 nargs() ⇒1 nargs(arg1, arg2, arg3) ⇒3
展開用テキストの中で$*
という表記をすることで、
全ての実引数を(クォートはせずに)コンマで区切ったものを表すことができます。
define(`echo', `$*') ⇒ echo(arg1, arg2, arg3 , arg4) ⇒arg1,arg2,arg3 ,arg4
引数をそれぞれクォートしなければならないことがよくありますが、
そんなときは$@
という表記を使います。
これは各引数がクォートされることを除けば$*
と同じです。
define(`echo', `$@') ⇒ echo(arg1, arg2, arg3 , arg4) ⇒arg1,arg2,arg3 ,arg4
引用符はどこに行ったのでしょうか? もちろん展開後のテキストを
再走査したときにm4
が食べてしまったのです。
違いを見るために、次のようにしてみましょう。
define(`echo1', `$*') ⇒ define(`echo2', `$@') ⇒ define(`foo', `This is macro `foo'.') ⇒ echo1(foo) ⇒This is macro This is macro foo.. echo2(foo) ⇒This is macro foo.
これが理解できないときはSee Traceを参照してください。
展開用テキストに記号‘$’が存在し、それに続く部分がm4
に理解できる
ものでないときは、‘$’は他のテキストと同じように
マクロ展開後のテキストへ単にコピーされます。
define(`foo', `$$$ hello $$$') ⇒ foo ⇒$$$ hello $$$
マクロを‘$12’などに展開させたいときは、
$
の後に一組の引用符を置きます。
これによって、m4
がその$
記号を引数への参照だと解釈してまうのを
防ぐことができます。