m4 ゴルフ FizzBuzz 他ネタバレ

ちょっと奇妙なコードになったので紹介します。

FizzBuzz 110 byte

define(l,`ifelse($1,101,dn,eval($1%15),0,FizzBuzz
,eval($1%5),0,Buzz
,eval($1%3),0,Fizz
,$1
)l(incr($1))')l(1)

マクロ l は、引数が 101 の時、ifelse で文字列 dn が生じ、それがマクロの呼び出し l(incr($1)) と結合して dnl になり、再帰が終了します。

number slide 116 byte

define(f,`$3ifelse($3
,$4,`m4exit',$1,0,`
f($2,incr($2)',` f(decr($1),$2'),incr($3),$4)')f(0,1,1,include(/dev/fd/0))

ifelse で生じる文字列だけではマクロ f の括弧が閉じていません。ifelse の後ろに続く部分と併せると括弧が閉じます。

コードとデータの区別がないなど悪夢としか思えない

しばしば Lisp の長所として、マクロがすごいとか、コードとデータの区別がないとかが挙げられますが、同じくマクロがありコードとデータの区別が無い m4 を使っていると、短所にしか思えません。
ので、「Lisp の m4 に対する優位点」または、「m4 の使いこなし方」を募集します。