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.