Copyright (C) 1989, 90, 91, 92, 93, 94 Free Software Foundation, Inc.
Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.
Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.
Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that this permission notice may be stated in a translation approved by the Foundation.
この章ではGNU m4
とは何か、その由来、
このマニュアルの読み方と使い方、m4
を起動する方法、
バグを報告する方法などを説明します。
マニュアルの続きを読むにあたっての助言をもってこの章は終ります。
ここから後の章ではm4
言語のすべての機能を詳しく説明します。
m4
序説
マクロを展開しながら入力を出力へコピーするという意味で、
m4
はマクロプロセッサだと言えます。
マクロにはm4
に最初から組み込まれている組み込み(builtin)マクロと、
ユーザが自分で定義するユーザ定義(user-defined)マクロの2種類があります。
マクロは何個でも引数を取ることができます。
m4
には単なるマクロの展開機能に加え、ファイルのインクルード、
UNIXコマンドの実行、整数演算、さまざまな方法でのテキスト操作、再帰、
その他のための関数がそろっています。
m4
はコンパイラのフロントエンドとして、
またマクロプロセッサそのものとしても使うことができます。
m4
マクロプロセッサは、ほとんどすべてのUNIXで利用することができます。
通常その存在に気づいているのは、ほんのわずかな人たちだけです。
しかし実際に気づいた人たちは往々にして熱心なユーザとなります。
GNU Autoconfで`configure'スクリプトを生成するには
GNU m4
が必要なため、GNU Autoconfの人気が高まったのがきっかけとなって
GNU m4
をインストールする人が増えました。
もっとも、そういう人が自分でm4
のプログラミングをすることは無いでしょう。
GNU m4
はわずかな違いを除けばSystem V, Release 3 版
とほぼ互換性があります。
詳細はSee section 他の版のm4
との互換性を参照してください。
ユーザの中にはm4
中毒になってしまった人たちもいます。
そういう人たちは最初は簡単なことにm4
を使い、
徐々に複雑なm4
マクロの書き方を習得しながら、
大きなこと大きなことへと挑戦していくのです。
いちど病みつきになってしまえば、簡単な問題を解くためにさえ
洗練されたm4
アプリケーションを書こうとして、実際の仕事よりも
自分のm4
スクリプトのデバッグに多くの時間をさくことになるのです。
熱中しやすいプログラマーはm4
で健康を損なうおそれがあるので
注意しましょう。
m4
の由来ここに記されている歴史に関する覚え書きはきわめて不完全なものであり、 なんら権威あるものでもありません。 事情に通じている方は、どうかこの節をふさわしいものにするのを手伝ってください。
GPM
はm4
の重要な祖先です。
C. Stratchey: "A General Purpose Macro generator", Computer Journal
8,3 (1965), pp. 225 ff を参照してください。
GPM
は、David Gries classic
"Compiler Construction for Digital Computers"でも簡潔に説明されています。
GPM
は純粋だったのに対して、
m4
は実生活にまつわる本物の複雑さを扱うことを意図したものでした。
そのため、たとえばマクロは前もって宣言しなくても認識されるようになり、
改行文字などの空白(whitespace)をスキップするのは簡単になり、
多くの構成要素が借り物ではなく内蔵されるようになりました。
もともとm4
はRational FORTRANプリプロセッサ
すなわちratfor
(cpp
に相当)のエンジンでした。
m4
の起動(オプション一覧)
m4
コマンドの形式は次のようになります。
m4
[option...] [macro-definitions...] [input-file...]
オプションは、短いオプション名を使うときは`-'で始め、
長いオプション名を使うときは`--'で始めます。
長いオプション名は、
そのオプションだと明確に特定できる先頭部分を書くだけで十分です。
m4
は次のオプションを受けつけます。
--version
m4
の実行を終了します。
--help
m4
の実行を終了します。
-G
--traditional
m4
との互換性を参照してください。
-E
--fatal-warnings
m4
の実行を停止し終了します。
-dflags
--debug=flags
-lnum
--arglength=num
-ofile
--error-output=file
-Idir
--include=dir
m4
がdirを探すようにします。
詳細はSee section インクルードするファイルのサーチを参照してください。
-e
--interactive
m4
を対話的な状態(interactive)にします。
これは、すべての出力をバッファリング無しで行ない、
割り込み(interrupt)を無視するということを意味します。
-s
--synclines
m4
をコンパイラのフロントエンドとして使うときなどに便利です。
ソースファイル名と行番号の情報は、`#line linenum
"filename"'という形式の指令(directive)によって表され、
出力の途中へ必要に応じて挿入されます。
この指令(directive)は次の行が入力ファイルfilenameの第linenum行
そのものであるか、もしくはその行の展開によるものであることを意味します。
`"filename"'の部分は、ファイル名が前の指令(directive)と
変わらない場合はしばしば省かれます。
このような同期指令は、必ずそれ自身で完全な一行に対してのみ与えられます。
ある出力行の途中に同期情報の食い違いがあるときは、
対応する同期指令の出力は次の行へと持ち越されます。
-P
--prefix-builtins
m4
の内部に登録されているすべての組み込みマクロの名前を
接頭辞`m4_'が付いたものに変更します。
このオプションを使ったときには、たとえば`define'の代わりに
`m4_define'、`__file__'の代わりに`m4___file__'と書かなければ
なりません。
-WREGEXP
--word-regexp=REGEXP
m4
の実装も存在する可能性があります。
(see section 単語(word)の字句構造を変更する)
-Hn
--hashsize=n
-Ln
--nesting-limit=n
m4
への複雑な入力を生成したときに
役に立ったという例もありますが、大部分のユーザにとっては無用の長物でしょう。
目障りだということになったときは、
このオプションは(まだ試験段階です)削除されてしまうかも知れません。
このオプションを使っても、再走査(rescanning)による無限ループを抜け出す
ことはできません。その一方で、再走査ループは必ずしもメモリや
スタック領域を大量に消費するわけではありません。
再走査ループをうまく使えば、複雑で時間のかかる処理をm4
に
やらせることができます。
この領域に制限をもうけるのは、m4
の能力を弱めてしまうことになるでしょう。
異常な使い方の例はいくらでもあります。
`define(`a', `a')a'はもっとも単純なものの例です
(しかしsee section 他の版のm4
との互換性)。
GNU m4
がこのようなケースを検出するのを期待するのは、
コンパイラシステムが無限ループを検出し、診断メッセージをだすのを
期待することに似ています。つまり、決定不能ではないとしても、
一般にとてもハードな問題です。
-Q
--quiet
--silent
-B
-S
-T
m4
との互換性のために存在しますが、
この実装では何の効果もありません。
-Nn
--diversions=n
m4
の以前のバージョンとの互換性のためだけに
存在し、同時に使うことができる出力切替え先(diversion)の数を制御するために
使われていました。現在は固定された制限値がなくなったので、
何の働きもしません。
`-D'や`-U'オプションを使うと、コマンドライン上でマクロを定義したり 削除したりすることができます。これらは次の形式をとります。
-Dname
-Dname=value
--define=name
--define=name=value
-Uname
--undefine=name
-tname
--trace=name
-Ffile
--freeze-state file
-Rfile
--reload-state file
コマンドライン上の残りの引数は、入力ファイルの名前として解釈します。 ファイル名の指定がないときは、標準入力から読み込みます。 ファイル名`-'は、標準入力を意味するものとして解釈します。
入力ファイルは、指定された順番に読み込みます。 標準入力は1度しか読むことができませんので、ファイル名`-'は コマンドライン上で1度しか使えません。
GNU m4
に関して問題が起こったり、バグと思われることを見つけたときは、
どうか、それを報告してください。
バグを報告する前に、実際にそれが本物のバグなのか確かめてください。
注意深くドキュメントを読み直して、あなたのしようとしたことが
実際にできると本当に書いてあるか確かめてください。
もし、ある事ができるのかどうか明確でないときは、それも報告してください。
それはドキュメントのバグです!
バグを報告したり、自分で直そうとする前に、
そのバグを発現させる、できるだけ小さな入力ファイルを作れないか試してください。
作ることができたときは、その入力ファイルとm4
が出す正確な結果を
私たちに送ってください。
また、あなたはどうなるはずだと思ったのかも添えてください。
これは、問題の原因が実はドキュメントにあるものなのか判断するのに役立ちます。
問題を正確に把握したら、電子メールを(インターネット)
`bug-m4@gnu.org'または(UUCP)
`mit-eddie!prep.ai.mit.edu!bug-gnu-utils'へ送ってください。
あなたが使っているm4
のバージョン番号も書いてください、
コマンド`m4 --version'で調べられます。
バグの報告以外の提案もいつでも歓迎します。 ドキュメントの不明確なところや分かりにくい機能についての質問があれば、 それも送ってください。
このマニュアルにはm4
の入力と出力の例がたくさん含まれており、
入力、出力およびm4
からのエラーメッセージを区別するための
簡単な表記法が用いられています。
これらの例は通常の文章とは間隔をあけて、
固定幅フォントで次のように表示されます。
This is an example of an example!
入力と出力を区別するため、m4
からの出力にはすべて`=>'が、
エラーメッセージにはすべて`error-->'が先頭につきます。
したがって次のようになります。
Example of input line (入力行の例) =>Output line from m4 (m4からの出力行の例) error-->and an error message (エラーメッセージの例)
m4
に最初から定義されているマクロの説明では、
マクロの呼び出しのプロトタイプが、引数に分かりやすい名前をつけて示されます。
これは次のようになります。
regexp(string, regexp, opt replacement)
m4
ではマクロの引数はすべて文字列ですが、
数字、ファイル名、正規表現としてなど特別な解釈のされかたをするものもあります。
3番目の引数の前にある`opt'は、この引数が省略可能であることを 表しています。省略したときは、空文字列として解釈されます。 引数リストの最後にある省略記号(`...')は、その後にいくつでも引数を 続けてよいことを示してます。
Go to the first, previous, next, last section, table of contents.