m4との互換性
この章ではm4の本実装とUNIXとりわけSystem V, Release 3における実装
との相違点を説明します。
m4で拡張された機能
本バージョンのm4にはSystem V m4に存在しない機能が
いくつかあります。
これらの追加された機能はコマンドライン・オプション`-G'を使うことで、
他のコマンドライン・オプションによって無効にされない限り、すべて抑制されます。
$n表記において、
nは複数の数字を含むことができますが、
System V m4は1つの数字しか受けつけません。
これによりGNU m4ではマクロが引数を9つだけでなく
いくつでも取ることができます。(see section マクロの引数)
includeとsincludeでインクルードされるファイルは、
作業ディレクトリで見つからないときは指定されたサーチ・パスのなかから
捜し出されます。サーチ・パスは`-I'オプションと環境引数`M4PATH'で
指定します。(see section インクルードするファイルのサーチ)
undivertへの引数は数字以外でもよく、
そのときはその名前を持つファイルを解釈しないまま出力に含めます。
(see section 出力を逆切替え(undivert)する)
printfをモデルとした
組み込みマクロformatを通じてサポートされています。(see section 書式付き出力)
regexp (see section 正規表現で検索する)と
patsubst (see section 正規表現でテキストの置換をする)によってサポートされています。
esyscmd (see section コマンドの出力を読む)で
m4に読み込むことができます。
builtin (see section 組み込みマクロの間接的な呼び出し)により任意の組み込みマクロへ
間接的にアクセスできます。
indir (see section マクロの間接的な呼び出し)を通じてマクロを間接的に呼び出せます。
__file__と__line__ (see section エラーメッセージを表示する)
を通じて現在の入力ファイルの名前と現在の入力行番号へアクセスできます。
dumpdefとマクロ・トレースの出力書式を
debugmode (see section デバッグ出力の制御)で制御することができます。
debugfile (see section デバッグ出力の保存)
で制御可能です。
上記の拡張に加えGNU m4には次のコマンドライン・オプションが
実装されています ― `-F', `-G', `-I',
`-L', `-R', `-V', `-W', `-d',
`-l', `-o', `-t'。
これらオプションの説明はSee section m4の起動(オプション一覧)を参照してください。
またGNU m4のデバッグとトレース機構は
他バージョンのm4にあるものより遥かに大規模です。
m4 にあってGNU m4にない機能
System Vバージョンのm4にはGNU m4にまだ実装されていない
機能がいくつかあります。
m4はdefnへの複数の引数をサポートしています。
GNU m4はこれを実装していません。
この機能の有用性が筆者にははっきりしません。
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を定義します。
両方とも空文字列に展開されます。
Go to the first, previous, next, last section, table of contents.