[ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
m4
との互換性 この章ではm4
の本実装とUNIXとりわけSystem V, Release 3における実装
との相違点を説明します。
15.1 GNU m4 で拡張された機能 | GNU m4で拡張された機能 | |
15.2 System V m4 にあってGNU m4 にない機能 | System V m4にあってGNU m4にない機能 | |
15.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)する)
書式付き出力が、Cのライブラリ関数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
にまだ実装されていない
機能がいくつかあります。
System V m4
はdefn
への複数の引数をサポートしています。
GNU m4
はこれを実装していません。
この機能の有用性が筆者には不明確です。
System Vバージョンのm4
と本実装との間には他にいくつか非互換な部分
があります。
テキストが出力切替え先(diversion)に送られるときのときの同期行の実装が
GNU m4
とSystem V m4
では異なります。
GNU m4
はテキストが出力切替え先に送られるときに同期行を出力しますが、
System V m4
ではこれが、出力切替え先のテキストが引き戻されるときになります。
問題は出力切替え先に送られる、または送られていたテキストに
どの行番号とファイル名をつけ加えるかです。
System V m4
は出力切替え先に送られていたすべてのテキストが
undivert
の呼び出しを含むソース行によって生成されたと見なしますが、
GNU m4
は出力切替え先に送られる時にテキストが生成されたと見なします。
筆者は同期行オプションを使うのは大抵m4
をコンパイラのフロントエンド
として使うときだと考えます。
もし出力切替え先に送られた行がコンパイラエラーを引き起こしたら、
エラーメッセージは出力切替え先のテキストが挿入しなおされた場所ではなく、
出力切替え先に送られた場所をおそらく指し示すべきでしょう。
GNU m4
は自己参照的な定義を防ごうとはしません。
define(`x', `x') define(`x', `x ') |
`x'が`x'を返すように定義することに、本質的に間違っているところは
ありません。
間違っているのはクォートされていない`x'を展開することです。
他のプログラミング言語で変数を使うのと同じように、
m4
で文字列を保持するためにマクロ使い、
さらにそれを次のようにチェックする人もいるでしょう:
ifelse(defn(`holder'), `value', …) |
このような場合、マクロが自分自身の名前を保持するのを禁止するのは
余計なお世話でしょう。
もちろん、これはGNU m4
ユーザが自分で首をくくるためのロープを
放置しておくことにはなります!
再走査によるハング(hang)は、
伝統的なプログラミング言語において無限ループに対するときのような、
注意深いプログラミングによって避けることができるでしょう。
GNU m4
は`-G'オプション無しだと、
__gnu__
が空行に展開されるように定義します。
UNIX システム上においてGNU m4
は`-G'オプションをつけると
マクロ__unix__
、つけないときはマクロunix
を定義します。
両方とも空文字列に展開されます。
[ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This document was generated by Akihiro Sagawa on June, 15 2005 using texi2html 1.70.