次: 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
は引数を与えたときだけ認識されます。