4 ms·
Why is there even an argument about this? Not being able to make a recursive call without potentially blowing the stack is a major drawback in any language. I'd
by raganwald 15y ago
Why is there even an argument about this? Not being able to make a recursive call without potentially blowing the stack is a major drawback in any language. I'd venture to say it's a "bug.”
You aren’t going to like Python:
I don't believe in recursion as the basis of all
programming. This is a fundamental belief of certain
computer scientists, especially those who love Scheme
and like to teach programming by starting with a "cons"
cell and recursion. But to me, seeing recursion as the
basis of everything else is just a nice theoretical
approach to fundamental mathematics (turtles all the
way down), not a day-to-day tool.
http://neopythonic.blogspot.com/2009/04/tail-recursion-elimination.html http://neopythonic.blogspot.com/2009/04/tail-recursion-elimi...
(I’m not advocating this view, just pointing out that there are programmers who appear in all other respects to be reasonable, intelligent, contributing members of computing society who actually feel that TCO is a bug, that 1000 calls ought to be enough for anybody, and so forth.)
- drblast 15y agoI don't like this in a lot of languages. But it's not a showstopper, just an annoyance to be aware of. That said, there should be no reason not to have your new modern programming language support tail calls. It's short-sighted, and can negatively affect more than just the trivial recursive case. So, new programming language inventors, if you're reading this, support tail call optimization and proper tail recursion from the beginning. Your language will be better for it.
- bascule 15y ago> there should be no reason not to have your new modern programming language support tail calls There's many valid reasons not to support TCO. The first one that comes to mind: it makes generating stack traces more difficult. Another reason: the JVM doesn't natively support TCO. This means to implement it you'll either need to use a trampoline (e.g. Erjang) or convert recursion to iteration (e.g. Clojure) The latter isn't too difficult, but when tail recursion merely provides an alternate syntax for iteration, and mutual tail recall recursion isn't supported, is there really as much of a point if your language is something like Ruby and already provides multiple means of iteration?
- gioele 15y ago> There's many valid reasons not to support TCO. The first one that comes to mind: it makes generating stack traces more difficult. > Another reason: the JVM doesn't natively support TCO. This means to implement it you'll either need to use a trampoline (e.g. Erjang) or convert recursion to iteration (e.g. Clojure) So you avoid a 35 years old functionality that makes many procedures smaller, faster and more understandable just to make the compilers simpler? Isn't this one of the usual tradeoffs where you (should) prefer having the compiler doing the boring and dirty job of converting a recursion to a loop, with all the bookkeeping of maintaining the state and making it thread-safe, simplifying the life of the application programmer at the expenses of the compiler programmer?
- anonymoushn 15y agoClojure doesn't really implement tail calls - if you need tail calls for several mutually recursive functions it becomes nontrivial to express because the looping constructs just won't do that for you.
- ken 15y agodrblast didn't say TCO was fundamental (just that it's an incredibly useful optimization and there's no reason to omit it), and Guido didn't say TCO is a bug (but that recursion shouldn't be the "basis of all programming"). There are two extremes here, but there is also a huge middle ground, where TCO is implemented but recursion is not the basis for all computation. Some of my favorite compilers do that.