Twitterで公開されているドキュメント「EffectiveScala 」には、次のコード例があります。
class Pool(conns: Seq[Conn]) {
private[this] val waiters = new Broker[Conn]
private[this] val returnConn = new Broker[Conn]
val get: Offer[Conn] = waiters.recv
def put(c: Conn) { returnConn ! c }
private[this] def loop(connq: Queue[Conn]) {
Offer.choose(
if (connq.isEmpty) Offer.never else {
val (head, rest) = connq.dequeue
waiters.send(head) { _ => loop(rest) }
},
returnConn.recv { c => loop(connq enqueue c) }
).sync()
}
loop(Queue.empty ++ conns)
}
コードは末尾再帰のようには見えず、そのように注釈が付けられていません。これはおそらくプログラムの存続期間中実行されたままになる接続プールであるため、このようなプールが最終的にスタックを爆破し、StackOverflowExceptionを生成するのを防ぐにはどうすればよいでしょうか。