m4によるバブルソート

参考:
Super Technique 講座〜m4 チュートリアル
GNU M4 1.4.18 macro processor

define(`forloop',
     `pushdef(`$1', `$2')_forloop(`$1', `$2', `$3', `$4')popdef(`$1')')
define(`_forloop',
     `$4`'ifelse($1, `$3', ,
     `define(`$1', incr($1))_forloop(`$1', `$2', `$3', `$4')')')

define(`head',$1)

define(`array', `defn(format(``array[%d]'', `$1'))')
define(`array_set', `define(format(``array[%d]'', `$1'), `$2')')
define(`array_init',`array_init2(0,`$@')')
define(`array_init2',`ifelse($1,SIZE,,
        `array_set(`$1',head($2))array_init2(incr($1),`shift($2)')')')

define(`print_array',`print_array2(0)')
define(`print_array2',`ifelse($1,SIZE,,`array($1) print_array2(incr($1))')')

define(`SIZE',`5')
array_init(50,40,30,20,10)
print_array()


dnl  以下の処理と同じ
dnl  for(int i = 0;i <= SIZE-2;i++){
dnl     for(int j = 0;j <= SIZE-2-i;j++){
dnl        if(array[j] > array[j+1]) swap(array[j],array[j+1])
dnl     }
dnl  }

forloop(`i', 0, eval(SIZE`-2'),
        `forloop(`j', 0, eval(SIZE`-2'-i),
            `ifelse(eval(array(j)`>'array(incr(j))),1,k
                    `array_set(SIZE,array(j))    dnl array(SIZE)を一時変数代わりにしている
                     array_set(j,array(incr(j)))
                     array_set(incr(j),array(SIZE))',)')
')

print_array()


出力(空行は省略)

50 40 30 20 10 
10 20 30 40 50 

まぁ,m4のマニュアルにforloopとarrayが載っていたのでそれをちょっといじっただけです.
他にもいろいろできそうですね.