Or even more simply, by blowing up the stack. If you manage to do 2^40 calls deep without blowing up the stack, you have TCE, if you do blow up the stack, you don't.
And you can tell if you blew up the stack by setting up an exception handler (or lisp condition or whatever equivalent).
> you can tell if you blew up the stack by setting up an exception handler (or lisp condition or whatever equivalent).
That only works if there's some way to tell whether the stack blew up (as you say: catching exceptions, lisp conditions, or whatever equivalent). I'd put those language features in the 'messy' category: useful on occasion; not used by most code; makes all code harder to reason about (hence the subjective "reasonably-unobservable" category above)
And you can tell if you blew up the stack by setting up an exception handler (or lisp condition or whatever equivalent).