I have several thoughts and comments to this, some against, some for tail recursion optimization. Perhaps Dmitry's suggestion is a good compromise.
The memory overhead is about 80 stack bytes per call function call for an average of 2 parameters passed. Currently the stack default is 2048 levels, which can be increased to hundreds of thousands vi the -s command line switch when starting newLISP.
Tail recursive functions are easy to rewrite as iterating functions. The benefit of code elegance and and code readability is greatest for recursive functions which are not tail recursive. The same benefit for tail recursive functions is small. As a side note: much of this judgement is subjective and a matter of taste either way.
Tail recursion in newLISP would rather slow down performance than speed it up. Checking for tail recursion would be expensive and not justify the speed performance gain of minimizing function call overhead. The benefit would be mainly in saving stack memory.
From a practical, application oriented point of view there is not enough benefit. I prefer iterative solutions most of the time because they tend to be much faster. There are algorithms like this one
http://newlisp.org/index.cgi?page=S-expressions_to_XML where recursion is the best way to do it. But algorithms like this one are not tail recursive anyway and tend to be shallow enough for the default 2048 level stack allocation.
To sum it up when tail recursion optimization is possible, it doesn't give us much benefit.
Still I have looked into it again and again, simply because the feature seemed to be interesting from a theoretical point of view and have some application benefits in (imho rare) situations. But I have not found a simple way to implement this without using much resources, checking for tail recursion would be expensive speed performance wise.
BUT, what I found interesting is Dmitry's comment/suggestion of implementing an explicit tail recursive function call (replacing the current function on the function call stack). So basically let the programmer decide when a recursive call is pushing the stack or not. This solution would not burden present performance, but give the programmer a way of optimizing a tail recursive function by saving stack and call overhead space. I will look into that.
Lutz