[ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
この章ではマクロの呼び出し、マクロの引数、マクロの展開が行われる過程 について説明します。
3.1 マクロの呼び出し | ||
3.2 マクロの呼び出しを抑制する | ||
3.3 マクロの引数 | ||
3.4 マクロの引数をクォートする | ||
3.5 マクロの展開 |
マクロを呼び出すときの形式には次のものがあります。
name |
これは引数を伴わないマクロの呼び出しです。
name(arg1, arg2, ..., argn) |
これはn個の引数を伴うマクロの呼び出しです。 マクロはいくつでも引数を取ることができます。 すべての引数は文字列ですが、 マクロによって引数の解釈のしかたが違うことがあります。
開きカッコ`('は、 スペースを入れずにnameの直後に書かなければいけません。 そうしないと、そのマクロは引数なしで呼び出されてしまいます。
引数なしでマクロを呼び出すためには、カッコを付けてはいけません。 たとえば、
name() |
これは、空の文字列を1つだけ引数として持つマクロの呼び出しであり、 引数を伴わないマクロの呼び出しではありません。
先行するマクロプロセッサ(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
が呼びだされるでしょう。
ある名前(name)が認識され、その名前に対するマクロの定義が存在するとき、 それはマクロとして展開されます。
その名前の直後に開きカッコ`('があるときは、 引数をすべて集めてから、マクロが呼び出されます。 足りない引数があるときは、空文字列が与えられたものとして解釈されます。 余分な引数は無視されます。
組み込みマクロの呼び出しで引数の数が不足しているとき、通常ならm4
は
警告を発しますが、コマンドラインオプション`-Q'を使えば、
この警告を抑制できます。
ユーザ定義マクロに対する引数の個数チェックはありません。
引数の収集が行われているときでも、通常と同じようにマクロの展開は行われます。 そして展開後のテキストに出現した、コンマ、引用符、 カッコなどはすべて個々の引数の定義に寄与します。 したがってfooが`, b, c'に展開されるとき、 次のマクロの呼び出し、
bar(a foo, d) |
は、4つの引数、`a ', `b', `c', `d' を伴うマクロの呼び出しとなります。 なぜ最初の引数に空白(whitespace)が含まれているのか理解するには、 引数の前にある空白はすべて削除されるのに対して、引数の後ろにある空白は 削除されないことを覚えておくとよいでしょう。
個々の引数の前にある、クォートされていない空白(whitespace)は削除されます。 各引数の内部では、 クォートされていないカッコはすべて対になっていなければなりません。 たとえば、fooがマクロのとき、
foo(() (`(') `(') |
これはひとつの引数を伴ったマクロの呼び出しで、 その引数の値は`() (() ('です。
引数自体がマクロ展開の対象になって欲しいのでない限り、 マクロへの引数はすべてクォートするのが普通です。 したがって、上記のカッコを含む例の`正しい'書き方は次のようになります。
foo(`() (() (') |
しかし、ときにはいくつかの引数をクォートしないでおく必要がある場合もあり、 また、そうすることに何ら問題はありません。 ただ、注意を怠ると人生がすこしばかり厳しいものになるだけです。
マクロの呼び出しが引数を伴うときはその収集が行われたあと、 マクロは展開されます。 そして展開後のテキストは入力に(クォートされずに)戻され、 そして再び読み込まれます(再走査)。 したがって、マクロを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.