m4 には、整数演算を行う 3 つの組み込みマクロがあります。incr() は、その数値の引数を 1 ずつ増やします。decr() は、1 ずつ減らします。したがって、プログラミングでよく使われる「N より 1 大きい」変数を定義するには、以下のように incr() を使用します。
define(N, 100) define(N1, `incr(N)')
つまり、N1 は N の現在値よりも 1 大きい値として定義されます。
演算でよく用いられるメカニズムは、eval() という組み込みマクロです。このマクロでは、整数に対して任意の演算を行うことができます。以下に、このマクロの演算子を優先度が高いものから順に示します。
+ - (単項) (**(** (** / % + - == != < <= > >= ! ‾ & | ^ && ||
必要に応じて、括弧を使用して演算をグループ化できます。eval() に最終的に渡される式のオペランドは、すべて数値でなければなりません。真の関係 (たとえば、1 > 0) は 1、偽の関係は 0 になります。eval() の精度は 32 ビットです。
簡単な例を以下に示します。この例では、M を 2(**(**N+1 として定義しています。
define(M, `eval(2(**(**N+1)')
define(N, 3) M(2)