[Date Prev][Date Next][Thread Prev][Thread Next]
- Subject: Re: Stack traces with tail calls: disabling tail recursion?
- From: Philipp Janda <siffiejoe@...>
- Date: Wed, 26 Feb 2014 10:54:46 +0100
Am 26.02.2014 09:53 schröbte Thijs Schreijer:
Well, you could do something like this:
return notail( func( x, y, z ) )
where `notail` is
function notail( ... )
Didn't test it, but I don't think this would work. The original call remains a tail call which remains indistinguishable, and now there is one more level on the stack, but they all point to 'notail' which is also indistinguishable. So back to square one...
Or am I missing something?
The call to `notail` is a tailcall, but that's ok because it is only one
level deep, and it is unlikely to cause an error, so it will never show
up in a stack trace. `notail`s arguments are evaluated before that, so
there can't be a tail call involved there (unless your compiler does
function inlining). It also works in practice, I tested it before posting.
Some preprocessor magic could do the trick I think.
Disabling it is easy by piping your code through the C preprocessor
(`#define notail( x ) x`), but adding the `notail` calls in the first
place is more difficult. I'd probably do that manually using a vim macro.