さらに考えてわかったような気がした。
この議論が理解の助けになった。 Google グループ
I think they chose that approach because they were trying to teach a
new concept, and not because that design has some (practical)
advantages.
なにがしかの値を返す手続きをどんどん呼び出していって、最後の呼び出しが値を返すと内側から外側へ向かって値を返しながら「値を待っていた」手続きを呼び出していき、一番外側の手続きが実行されて式全体の値が返るのが、普通の再帰。で、第八章の例は、そうではない別の考え方を示しているということ。
Indeed the approach in "The Little Schemer" has a practical advantage:
it's tail recursive. Although they did not mentioned this fact, the
tenth commandment is a hint in this direction:
*Build* *functions* to collect more than one value at a time.
[my emphasis]
継続渡しスタイルの場合、関数が再帰呼び出しされていくとともに手続きを手続きで囲っていく。そうして最後の再帰呼び出しが終わると、ネストされた手続きのカタマリ (タマネギ) が残される。いま自分で組み立てた (Build functions) 手続きのカタマリが。そして一番外側から内側へ向かって引数を渡しながら手続きが実行されていく。「他の手続きが終わらないと自分自身の処理も終わらないので待っている手続き」はないので、これを末尾再帰というのだろう。
けどいろんなページで call/cc の説明を読むと自信が揺らぐ。「継続をとりだす」ってのは、タマネギの組み立てを途中でやめることができる、ということなのかなー。