[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

3. マクロを呼び出す方法

この章ではマクロの呼び出し、マクロの引数、マクロの展開が行われる過程 について説明します。


3.1 マクロの呼び出し

マクロを呼び出すときの形式には次のものがあります。

 
name

これは引数を伴わないマクロの呼び出しです。

 
name(arg1, arg2, ..., argn)

これはn個の引数を伴うマクロの呼び出しです。 マクロはいくつでも引数を取ることができます。 すべての引数は文字列ですが、 マクロによって引数の解釈のしかたが違うことがあります。

開きカッコ`('は、 スペースを入れずにname直後に書かなければいけません。 そうしないと、そのマクロは引数なしで呼び出されてしまいます。

引数なしでマクロを呼び出すためには、カッコを付けてはいけません。 たとえば、

 
name()

これは、空の文字列を1つだけ引数として持つマクロの呼び出しであり、 引数を伴わないマクロの呼び出しではありません。


3.2 マクロの呼び出しを抑制する

先行するマクロプロセッサ(StratcheyのGPMなど)に比べて、 m4言語の革新的なところは、 先頭に特別な文字をつけて書くといったことをしなくても、マクロの呼び出しを識別できる能力です。 この機能は多くの場合において便利なのですが、 ときには不必要なマクロの呼び出しの原因となることがあります。 そこで、GNU m4には名前(name)がマクロの呼び出しとして認識されるのを 抑制するいくつかの機構やテクニックがあります。

まず、多くの組み込みマクロは引数なしで呼び出しても意味がないので、 それらの名前の直後に開きカッコがないときは、組み込みマクロは呼び出されません。 これによって、`include'や`eval'がマクロとして認識されてしまう といったよくあるケースに対処できます。 後ほど、この文書に出てくる "このマクロは引数を与えたときだけ認識されます"という文は、 この動作を意味します。

また、コマンドオプション(--prefix-builtins, または-P) を使うと、組み込みマクロを呼び出すときは、 その名前の先頭に`m4_'をつけなければ認識されなくなります。 たとえばm4_dnlや、さらにはm4_m4exitと 書かなければならなくなります。 ちなみに、このオプションはユーザ定義のマクロには何の効果ももちません。

changeword機能がコンパイル時に組み込まれたm4を 使用しているときは、マクロ名の認識に使われる字句構成規則をはるかに柔軟に 指定することができます。 この規則は組み込みマクロとユーザ定義マクロ両方の名前に作用します。 この試験的な機能の詳細はSee section 単語(word)の字句構造を変更するを参照してください。

もちろん、ある名前がマクロの呼び出しとして認識されるのを防ぐ、 もっとも単純な方法は、その名前をクォートする(引用符で囲む)ことです。 この節の残り部分では、クォートすることがマクロの呼び出しにどのように 影響するのか、またマクロの呼び出しを抑制するには それをどのように使えばよいのかを、もうすこし詳しく見ていきます。

マクロの呼び出しを抑制したいときは名前全体をクォートするのが普通ですが、 名前の数文字をクォートするだけでも同じ効果があります。 また、空文字列をクォートするだけでもよいのですが、 この場合は名前の内部でないと効果はありません。たとえば、

 
`divert'
`d'ivert
di`ver't
div`'ert

これらの結果はすべて文字列`divert'となりますが、

 
`'divert
divert`'

こちらは両方とも組み込みマクロdivertが呼ばれます。

マクロを評価して生じた出力は常に再走査(rescan)されます。 次の例では、m4に`substr(abcde, 3, 2)'を入力として 与えたときと同様に、文字列`de'が生成されます。

 
define(`x', `substr(ab')
define(`y', `cde, 3, 2)')
x`'y

クォートされた文字列(quoted string)の両端にあるクォートされていない文字列は、 マクロ名として認識される対象となります。 次の例では、空文字列をクォートすることによって dnlマクロが認識されるようになります。

 
define(`macro', `di$1')
macro(v)`'dnl

もし引用符がなかったら、 文字列`divdnl'とそれに続く改行文字が生成されるだけでしょう。

クォートすることで、マクロ展開による文字列とその周囲の文字を連結したものが マクロの名前として認識されるのを防ぐことができます。たとえば、

 
define(`macro', `di$1')
macro(v)`ert'

この入力からは、文字列`divert'が生み出されます。 もし引用符がなければ、組み込みマクロdivertが呼びだされるでしょう。


3.3 マクロの引数

ある名前(name)が認識され、その名前に対するマクロの定義が存在するとき、 それはマクロとして展開されます。

その名前の直後に開きカッコ`('があるときは、 引数をすべて集めてから、マクロが呼び出されます。 足りない引数があるときは、空文字列が与えられたものとして解釈されます。 余分な引数は無視されます。

組み込みマクロの呼び出しで引数の数が不足しているとき、通常ならm4は 警告を発しますが、コマンドラインオプション`-Q'を使えば、 この警告を抑制できます。 ユーザ定義マクロに対する引数の個数チェックはありません。

引数の収集が行われているときでも、通常と同じようにマクロの展開は行われます。 そして展開後のテキストに出現した、コンマ、引用符、 カッコなどはすべて個々の引数の定義に寄与します。 したがってfooが`, b, c'に展開されるとき、 次のマクロの呼び出し、

 
bar(a foo, d)

は、4つの引数、`a ', `b', `c', `d' を伴うマクロの呼び出しとなります。 なぜ最初の引数に空白(whitespace)が含まれているのか理解するには、 引数の前にある空白はすべて削除されるのに対して、引数の後ろにある空白は 削除されないことを覚えておくとよいでしょう。


3.4 マクロの引数をクォートする

個々の引数の前にある、クォートされていない空白(whitespace)は削除されます。 各引数の内部では、 クォートされていないカッコはすべて対になっていなければなりません。 たとえば、fooがマクロのとき、

 
foo(() (`(') `(')

これはひとつの引数を伴ったマクロの呼び出しで、 その引数の値は`() (() ('です。

引数自体がマクロ展開の対象になって欲しいのでない限り、 マクロへの引数はすべてクォートするのが普通です。 したがって、上記のカッコを含む例の`正しい'書き方は次のようになります。

 
foo(`() (() (')

しかし、ときにはいくつかの引数をクォートしないでおく必要がある場合もあり、 また、そうすることに何ら問題はありません。 ただ、注意を怠ると人生がすこしばかり厳しいものになるだけです。


3.5 マクロの展開

マクロの呼び出しが引数を伴うときはその収集が行われたあと、 マクロは展開されます。 そして展開後のテキストは入力に(クォートされずに)戻され、 そして再び読み込まれます(再走査)。 したがって、マクロを1つ呼び出したことで得られたテキストの中に、 完全なマクロの呼び出しやその一部が含まれている場合、 そこから更に多くのマクロが呼ばれることもあるわけです。

非常に簡単な例を挙げると、fooが`bar'へ展開され、 barが`Hello world'へ展開されるとすると、入力

 
foo

は最初に`bar'へ展開された後、再び走査が行われ `Hello world'へ展開されます。


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by Akihiro Sagawa on June, 15 2005 using texi2html 1.70.