次: , 前: Ifdef, 上: Conditionals


5.2 文字列の比較

もう一方の条件構文ifelseはずっと強力です。 与える引数の個数によって長いコメントの挿入のためや、 if-else構文、多重分岐などとして使うことができます。

     ifelse(comment)
     ifelse(string-1, string-2, equal, opt not-equal)
     ifelse(string-1, string-2, equal, ...)

ifelseに1つだけ引数を与えた場合、 それは単に捨てられて、何も出力されません。 これはdnlを何度も使わずにブロックコメントを 挿入するために良く使われる、m4におけるイディオムです。 GNU m4ではこの特殊な使用法が認められているので、 引数が足りないことに対する警告はこのケースでは発せられません。

ifelseに3つ、または4つの引数を与えて呼び出すと、 string-1string-2が(文字毎に比べて)等しければ equalに展開されます。 等しくなければnot-equalに展開されます。

     ifelse(foo, bar, `true')
     =>
     ifelse(foo, foo, `true')
     =>true
     ifelse(foo, bar, `true', `false')
     =>false
     ifelse(foo, foo, `true', `false')
     =>true

またifelseには4つ以上の引数を与えることができます。 この場合、ifelseは伝統的なプログラミング言語におけるcase文や switch文と同じように機能します。 string-1string-2が等しければifelseequalに 展開され、等しくなければ最初の3つの引数が捨てられたあと、 まったくおなじ手続きが繰り返されます。例で示したほうがいいでしょう。

     ifelse(foo, bar, `third', gnu, gnats, `sixth', `seventh')
     =>seventh

もちろん、通常はこれらの例よりもうすこし高度な使い方をするでしょう。 ifelseのよくある使い方のひとつは、さまざまな種類のループ処理を 実装するマクロの中で使用する場合です。

マクロifelseは引数を与えたときだけ認識されます。