Next: Macro Arguments, Previous: Invocation, Up: Macros
先行するマクロプロセッサ(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
が呼びだされるでしょう。