次: , 前: Invocation, 上: Macros


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

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

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

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

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

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

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

     `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が呼びだされるでしょう。