tail call trampolining using exceptions