No more tail calls in Javascript?
lambda-the-ultimate.org
lambda-the-ultimate.org
I can't see why you would leave that out of the system.
And that's the political problem here: The implementors don't want to start with a blank sheet of paper, they want to work from what they already have and find convenient to build.
You know the expression "Lisp is a black hole?" TCO is one of those massy features that drags a language inside Scheme's Schwarzschild radius. They will end up writing a Scheme implementation with JS syntax and DOM support.
They know it and obviously don't want to go there, thus the mealy-mouthed "this feature is not necessary because we provide the all-powerful for loop and OO programming." Meanwhile, as the OP points out, the other features they provide can be written by programmers and supplied in libraries, so they really are not as essential to the implementers' debate as TCO.
Portions of this rant may be Erik Naggum's intellectual offspring, only misshapen and lacking his insight and biting wit
I suspect that one reason it can do this successfully is that the authors are not afraid to break backwards compatibility with each new major release of the language. The fact that it is intended to be embedded within an application which ships with the appropriate revision of the language helps greatly in this regard.
And why kill EVAL? Because it makes it a lot harder to reason about programs and the future mandates we can prove properties about our programs. Better start now than later.
For example, Python does not optimize tail calls, but supports many functional idioms anyway and is quite pleasant to use.
So, yeah, having tail call optimization be a mandatory part of Javascript would be cool from a language nerd point of view, but it would have very little practical impact.
The difference between O(1) and O(n) memory usage is a big deal, IMHO...
That's exactly the point. You can use nice functional idioms in Python as long as you make the main loop(s) that crunch data iterative. Same thing in Javascript.
Adding tail-call optimization adds little to Javascript; it's nice to have but has no high return on investment (in terms of the effort you put into the language vs. what becomes impossible if you omit it).
Case in point: Think of all the criticism directed at Python. The lack of tail-call optimization is not voiced very frequently.
The point of recursion is that it makes really hard problems simple to solve.
Anyway, in Python you can always fake TCO using decorators. As long as someone invents the same thing for Javascript, no harm, no foul.
It's just that Language feature X is clearly unnecessary because Language Y has feature Z instead, and I'm perfectly happy programming in Y has been raised, refuted, defended, and debated so many times that the people with the most experience arguing either side of it are the ones who are least likely to consider trotting it out again productive, and the people with the least experience are most likely to find arguing it again productive and intellectually rewarding.