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が載っていたのでそれをちょっといじっただけです.
他にもいろいろできそうですね.