Next: Compatibility, Previous: Miscellaneous, Up: Top
何百もの定義やその他の手間がかかる初期化をまとめた共通の基盤を土台として、
その上にさらに大きなm4
アプリケーションをいくつも構築していくことが
できます。通常はその共通の基盤を1つ以上のファイルに格納しておいてm4
を
起動するたびにユーザの入力ファイル名の前にそれらのファイル名を羅列するか、
ユーザの入力ファイルからinclude
します。
巨大なアプリケーションの共通基盤を何度も何度も繰り返し読み込むのは
時間がかかることでしょう。m4
には大きな共通基盤を使う
アプリケーションの開始時間をスピードアップするための機構が用意されて
います。ユーザが次のコマンドラインを繰り返し使うとします。
m4 base.m4 input.m4
ここでinput.m4は起動のたびにいろいろな内容を持ち、 base.m4はかなり固定的な内容を持っているとします。 こういうときは、次のようにした方がいいでしょう。
m4 -F base.m4f base.m4
このように一度実行しておき、必要になるたびに次のように実行します。
m4 -R base.m4f input.m4
最初の-F
オプションを含んでいる呼び出しはbase.m4を読んで実行
することで、さまざまなアプリケーションマクロの定義やその他の初期化を
行います。入力ファイルbase.m4の処理が完全に終ってから、
GNU m4
は凍結(frozen)ファイルをbase.m4fとして生成します。
このファイルはm4
の内部状態のある種のスナップショットとなっています。
後者の-R
オプションを含んでいる呼び出しでは、どの入力ファイルが
読み込まれるよりも前に、base.m4fからm4
のメモリの内部状態を
リロード(reload)しておくことができます。
このようにして、まっさらな状態のm4
から始めるかわりに
前もって起動しておいたときの状態へと効率的に復帰したあとで入力を読み込み
ます。この例ではbase.m4を新たに読んだときと効果は同じですが、それを
ずっと速く行うことができます。
m4
の1回の起動で作ったり読み込んだりできる凍結ファイルはそれぞれ
1つだけです。
一度に2つの凍結ファイルの内容を回復することはできません。
しかし-R
と-F
オプションを同時につかうことで、凍結ファイルを
すこしずつ更新していくことはできます。例えば多少の注意を払う事で、次のコマンドは、
m4 file1.m4 file2.m4 file3.m4 file4.m4
最終的にこれと同じ出力が段段と蓄積されていくような、次の一連の コマンド列に分けることができるでしょう。
m4 -F file1.m4f file1.m4 m4 -R file1.m4f -F file2.m4f file2.m4 m4 -R file2.m4f -F file3.m4f file3.m4 m4 -R file3.m4f file4.m4
多少の注意を払う必要があるというのは、これがどんな場合にもうまく動く
ようにするためのあらゆる対策がこうじられているわけではないからです。
とりわけ、マクロのトレース属性には対応していませんしchangeword
の
現在の設定に関してもそうです。m4
のいくつかのオプションが1度目で
使用されて、次は使用されなかった場合にどのように作用するかも完全には検討
されていません。一方でpushdef
された定義のスタックが正しく扱われる
ことは保証されています。またundefine
された定義、組み込みマクロの
名前変更、引用符やコメント記号の変更についても同じく正しい動作が保証され
ています。
m4
の実行が凍結されるとき、実行終了時に起こる自動的な出力の
逆切替え(undiversion)は抑制されます。そのかわり全ての正の番号をもつ
出力切替え先の内容は凍結ファイルに保存されます。使用中の出力切替え先の
番号も伝えられます。
リロード(reload)しようとしている凍結ファイルがカレントディレクトリに
ある必要はありません。凍結ファイルを探す方法はインクルードファイル
(include
)の場合と同じです。(see Search Path)
凍結ファイルは複数のアーキテクチャで共有することができます。
1つのマシンで凍結ファイルを作り、それを他のマシンで使うときは2番目の
マシンで同じか新しいバージョンのGNU m4
を使っているのなら確実です。
凍結ファイルは単純な(編集可能な)テキストファイルで、アルファベット大文字
で始まり改行文字(<NL>)で終る指令から成り立っています。指令があるはず
の場所に#があるときはコメント行の始まりとなり、空行とあわせて無視
されます。次の説明ではlengthは常に対応するstringを参照します。
数字は常に10進数で表されます。指令の一覧です。
V
number <NL>
C
length1 ,
length2 <NL>
string1 string2 <NL>
Q
length1 ,
length2 <NL>
string1 string2 <NL>
F
length1 ,
length2 <NL>
string1 string2 <NL>
pushdef
を使い、string1が組み込みマクロとして名前string2を
もつ関数に展開されるように定義します。
T
length1 ,
length2 <NL>
string1 string2 <NL>
pushdef
を使い、string1がテキストstring2に展開される
ように定義します。
D
number,
length <NL>
string <NL>
m4
内部
からそのようにこのコマンドが生成されることはありません。