I probably should have mentioned I'm setting up an RPC protocol.
I'm using throw/catch because there are lambdas setup inside that
block (but outside the while t). Inside the lambda is the throw.
I then store these lambdas in a global CONTINUATIONS var that the
process filter looks up and calls if appropriate. The infloop breaks then.
It's much harder (and much less efficient at first sight) to do it by polling
CONDITION, but I may be missing something. Let me know
if you want to look at a concrete example of the lambda strategy.
BTW I learned this strategy reading SLIME, I just simplified it when lexical
binding came along. It's been working there and in other projects for
a long time.