The second system syndrome is that evil effect that often happens when redesign a small, working system so that it becomes a huge leviathan built by piling new features over new features.
Today I was reading the overview of ECMASCript 4 from ecmascript.org, and I got this very bad feeling that maybe the fourth version of ES, is suffering of an extremely strong case of this problem.
I believe that part of the success of ES in its current incarnation is that it is quite simple. Yeah, it has its shortcomings and oddities, but in general it is simple enough that everyone can learn it in no time.
ES4, on the other hand, seems to have included almost everything that came out from programming languages in the last 50 years, save Prolog and APL.
For example, it has prototypes, interfaces, classes, metaclasses, higher order types and generic functions, which for what I can tell entails all the work ever done on object-orientation (maybe predicate classes are missing, but they may be there too).
The argument list of a function may have named arguments, rest/variadic arguments, optional arguments, optional types including: non-nullable arguments,
like arguments (this seems the same as in Eiffel, used to link the type of an object to another),
wrap arguments that perform automatic conversion of an object of type X into another of type Y,
Whereas many languages I know provide a concept of Module or Package to handle namespacing issues, ES4 provides
program units to support name hiding and modularity.
Not only this, but you can introduce variables with
var to have it in the object scope or with
let to have it in a block, so even more namespace separation :-)
Finally, ES4 incorporates some cool features such as list comprehensions, a kind of destructuring assignment/pattern matching, python-like slicing, triple-quotes and generators (
though AFAICT this are only one way generators like in older python releases, where you can yield but you can't receive values ).
And operator overloading, program pragmas, required tail call elimination, a host of interesting keywords suchy as
intrinsic to reify operators,
dynamic to have classes that allow adding of new fields,
static to have class-level functions,
final to avoid inheritance and
override to use it,
public and so on.
And of course, 6 different values of falsity, with
undefined, but not
ECMAScript 4 seems cool, I want to use a lot of those things (yay for multi method dispatch!), but maybe it is changing the language a little bit too much .
How many of the current user of ES in one of its incarnations have ever heard of product types? Will they grasp at once the logic behind the subtyping relation between functions, with all that covariant and contravariant stuff? Will they need it at all?
I hope the internet pipes will resist to the number of "metaclass vs meta namespace vs prototype vs superclass" questions on usenet.