自己再帰のみ考える。

1. (defun-rec name args body-forms) というマクロを定義する
2. body-forms にマクロが含まれていたら全て展開する
3. マクロ展開後に、name と同じ名前の関数呼び出しがあったら再帰とする
4. その関数の戻り値が他の関数の引数になっていたり、変数に束縛されていなかったら末尾再帰とする
5. 3-4 を繰り返して全ての末尾再帰を探し出す
6. S 式を変形して末尾再帰をループに書き換える

マクロでやるよりコンパイラに手を入れた方が…