グローバル(不揮発性)カウンタのm4マクロ実装

グローバル(不揮発性)カウンタのm4マクロ実装

最初の呼び出しでは1に、2番目の呼び出しでは2に拡張するm4マクロ(パラメータなし)を定義できますか?つまり、呼び出された回数を格納できる内部メモリが必要です。これは可能ですか?

答え1

counter2つのマクロ、つまり現在の値を格納するマクロとcountその値に展開し、「カウンタ」をオーバーライドするマクロを使用してこれを実行できます。たとえば、次のようになります。

define(`counter',`0')dnl
define(`count',`define(`counter',eval(counter+1))counter')dnl

countこのマクロを使用すると、最初に次のcounter値を保存するようにオーバーライドされ、次に(現在の値を1ずつ増やして)その値が使用されます。

単一のマクロを使用してこれを行う方法がわかりません。したがって、これがあなたの質問の重要な側面である場合、これは答えではありません。

答え2

私はGNUメーリングリストに同様の質問をしましたm4-discuss。 Doug McIlroyは、次のコードに返信して共有しました。

define(bump,`define(`$1',incr($1))')dnl
define(counter,0)dnl
counter
bump(`counter')counter
bump(`counter')counter

関連情報