フムフムヌクヌクアプアア本の 19.4 call/cc の節がきつかったので、メモしときます。
- call/cc は、他言語の return を手続きとして作ってるような物。渡された手続きを呼べば、元の処理に復帰(次の処理にgoto)できる。
- find-foldの呼び出し側で、大域脱出するための継続(cont0)を作って、それをbreakとして内部に渡す
- 内部(breaker/cc)では、内部の処理の継続をnextに束縛し、先ほどのbreakを使って処理がこれ以上続かないように大域脱出する
要点はこれだけです。大域脱出用の継続と内部処理の継続を2つ作って、通常とは違う流れとなるようにコントロールしてるのがポイントです。