何百もの定義や手間がかかるその他の初期化を含んだ共通の基盤を土台として、
複数のさらに大きな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 section インクルードするファイルのサーチ)
凍結ファイルは複数のアーキテクチャで共有することができます。
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内部からこのようにこのコマンドが生成されることはありません。
Go to the first, previous, next, last section, table of contents.