Previous: Incompatibilities, Up: Compatibility
System Vバージョンのm4
と本実装との間には他にいくつか非互換な部分
があります。
m4
とSystem V m4
では異なります。
GNU m4
はテキストが出力切替え先に送られるときに同期行を出力しますが、
System V m4
ではこれが、出力切替え先のテキストが引き戻されるときになります。
問題は出力切替え先に送られる、または送られていたテキストに
どの行番号とファイル名をつけ加えるかです。
System V m4
は出力切替え先に送られていたすべてのテキストが
undivert
の呼び出しを含むソース行によって生成されたと見なしますが、
GNU m4
は出力切替え先に送られる時にテキストが生成されたと見なします。
筆者は同期行オプションを使うのは大抵m4
をコンパイラのフロントエンド
として使うときだと考えます。
もし出力切替え先に送られた行がコンパイラエラーを引き起こしたら、
エラーメッセージは出力切替え先のテキストが挿入しなおされた場所ではなく、
出力切替え先に送られた場所をおそらく指し示すべきでしょう。
m4
は自己参照的な定義を防ごうとはしません。
define(`x', `x') define(`x', `x ')
‘x’が‘x’を返すように定義することに、本質的に間違っているところは
ありません。
間違っているのはクォートされていない‘x’を展開することです。
他のプログラミング言語で変数を使うのと同じように、
m4
で文字列を保持するためにマクロ使い、
さらにそれを次のようにチェックする人もいるでしょう:
ifelse(defn(`holder'), `value', ...)
このような場合、マクロが自分自身の名前を保持するのを禁止するのは
余計なお世話でしょう。
もちろん、これはGNU m4
ユーザが自分で首をくくるためのロープを
放置しておくことにはなります!
再走査によるハング(hang)は、
伝統的なプログラミング言語において無限ループに対するときのような、
注意深いプログラミングによって避けることができるでしょう。
m4
は‘-G’オプション無しだと、
__gnu__
が空行に展開されるように定義します。
UNIX システム上においてGNU m4
は‘-G’オプションをつけると
マクロ__unix__
、つけないときはマクロunix
を定義します。
両方とも空文字列に展開されます。