次: Loops, 前: Ifdef, 上: Conditionals
もう一方の条件構文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-1とstring-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-1とstring-2が等しければifelseはequalに
展開され、等しくなければ最初の3つの引数が捨てられたあと、
まったくおなじ手続きが繰り返されます。例で示したほうがいいでしょう。
ifelse(foo, bar, `third', gnu, gnats, `sixth', `seventh')
=>seventh
もちろん、通常はこれらの例よりもうすこし高度な使い方をするでしょう。
ifelseのよくある使い方のひとつは、さまざまな種類のループ処理を
実装するマクロの中で使用する場合です。
マクロifelseは引数を与えたときだけ認識されます。