>>50
その処理を一般化すると「ループからジェネレータへの変換」と考えられる。
これがそのまま使えると思う。
http://practical-scheme.net/wiliki/wiliki.cgi?Scheme%3agenerator%E3%81%A8do%E3%81%A8while#H-3put3dsr6wpqj
call/cc を使う典型的な例なので call/cc の解説の中では似たようなコードはよくある。

限定継続を提供している処理系ならともっと簡単に書ける。
http://practical-scheme.net/wiliki/wiliki.cgi?Scheme%3a%E9%83%A8%E5%88%86%E7%B6%99%E7%B6%9A%3a%E3%82%A4%E3%83%86%E3%83%AC%E3%83%BC%E3%82%BF%E3%81%AE%E5%8F%8D%E8%BB%A2

そういや限定継続って規格に入ってないし、 srfi にもなってないっぽいなぁ。
racket には shit と reset だけじゃなくていくつかのバリエーションがあるみたいだね。