The issue of Lisp is, I think, an empirical one.
Back when GNOME made the move away from Sawfish for Metacity, at about the same time Sun came aboard, one of the wingnuts on Slashdot made a pejorative comment about the Sun programmers, questioning their abilities if they couldn’t handle the Lisp required to maintain Sawfish.
The thing is, most everyone learned Lisp in school, right? And pretty much no one uses it now, right? I was reminded of this by a comment today from Joel Spolsky:
I think that if you try to ignore the fact that millions of programmers around the world have learned lisp and don’t prefer to use it, you’re in the land of morbid cognitive dissonance. And this attitude that “lisp is only for leet programmers so it’s good because only l33t programmers will work on our code so our code will be extra good” is just bullshit, I’m sorry. Plenty of brilliant programmers know lisp just fine and still choose other languages. Most of them, in fact.
I’ve always had a soft spot for Lisp since I wrote a piece years ago about Greg Chaitin, the mathematician. Or is he a computer scientist?
I was sort of star struck, and we had coffee at a place across the street from the university, and he tried to explain to me randomness and halting and incompletness. And he told me that there was nothing quite so elegant as a Lisp. In retrospect, trying to write about mathematics was a fool’s errand, and I don’t try it much any more. Words can never do justice to the scribbles Chaitin sketched out for me as he explained to me the incompleteness of the real numbers – proved it for me, right there on a coffee-stained table. (I still love that juxtaposition, the purity of the ideal of the incompleteness of the real numbers on a coffee-stained table. The place is a pawn shop now.)
I didn’t really know anything about computer languages then, and I imagined a Lisp as a shining city on a hill, a place where the purity of the ideal was made tangible, incarnate in code. And I suppose that’s still what Lisp is, but down here by the docks where the work gets done, people seem to have set aside the beauty of Lisp for what must apparently have been more practical concerns.
I think you have your terminology confused. The real numbers are “complete” in the metric sense. This means that all Cauchy sequences converge, ie if for all e>0 one can find N such that |x_i-x_j|N then there is a “limit point” x IN the reals such that we can find an n such that |x_i-x|n. This notion of completeness connects the notion of point in the sequence getting arbitrarily close to each other to the notion of a limit point which the sequence converges to.
It is not hard to come up with spaces that are not complete. The obvious example is the rationals. Take irrational number and consider its decimal expansion. If you chop it off at n digits you get a sequence. The different elements x_i, x_j of the sequence differ by no more than 10^{-i} where i
I think you have your terminology confused. The real numbers are “complete” in the metric sense. This means that all Cauchy sequences converge, ie if for all e > 0 one can find N such that |x_i-x_j|< e N then there is a “limit point” x IN the reals such that we can find an n such that |x_i-x|< n. This notion of completeness connects the notion of point in the sequence getting arbitrarily close to each other to the notion of a limit point which the sequence converges to.
It is not hard to come up with spaces that are not complete. The obvious example is the rationals. Take irrational number and consider its decimal expansion. If you chop it off at n digits you get a sequence. The different elements x_i, x_j of the sequence differ by no more than 10^{-i} where i < j but they will converge to an irrational number (ie something NOT in the rationals). Complete topological spaces are critical to the foundation of calculus since it is exceedingly difficult to take limits in incomplete topological spaces (you have to know the limit point before you can prove its existence), while the cauchy criterion is easy to verify (since you already have the elements of the sequence at your disposal).
There are other notions of incompleteness, for instance the Godel Completeness/Incompleteness Theorems which show that the set theory on which basic number theory is based is as complete as it can be (we can prove anything that we can prove) but that there are certain things which are beyond any consistent system (things which we can not prove nor prove that we cannot prove or something). As you can tell I don’t understand set theory.
However I fail to see how this would connect to the real numbers. Another popular proof regarding the real numbers is Cantor’s diagonalization which shows that there are more real numbers than there are integers (although both quantities are infinite).
There’s a largish number Lisp variants out there, just like there are the Algol variants, from Pascal to C#. Some of them are driven by beauty and simplicity (Scheme), some by very practical concerns (Common Lisp), some are less general purpose and are more focused on a single task. Common Lisp is big, with very practical aims directed at, and dictated by, real world use. It’s very much not “an excercise in recursive pain”, as Kent Pitman put it. And it has many warts, due to the nature of the process that led to the birth of standard. In short, its main selling point is not beauty.
Of course all languages have their weaknesses, and implementations have even more. I wouldn’t mind seeing more of the genericity of Python in Common Lisp’s base types and the functions that work on them. On the other hand, I’d love to see in Python a powerful macro facility for extending the language, an object system that was equal to CLOS, the high efficiency brought by the compilers and frankly I wouldn’t look back for a second if it had a s-expression syntax too. Ok, so I’d love to use Common Lisp. Or possibly Goo.
What’s keeping me back? Lack of Unicode support in most of the free implementations, for one thing. Mostly, though, just the fact that with the more mainstream languages most utilities and library wrappers you might need are already out there, and I’m really more interested in working on applications than on the plumbing. But things are improving in CL land, too. And a wannabe pundit like Spolsky — who only writes to attract attention to himself and his business as far as I can tell — talking about Lisp is hopefully an indication of the growing popularity of the language.
Which is better: Chinese or French? We don’t know enough about human cognition to really make empirical arguments as to which language is “better” for a particular metric (or set of metrics). It seems like programming language comparisons are similarly mired in anecdotal or subjective arguments. People do use Lisp, just like people do use Chinese. Sometimes it’s an accident of circumstance (birth/education/inclination) that decides which language a person knows and prefers. In the absense of empirical data, people are free to rely upon their subjective impressions and anecdotal evidence, but don’t expect those to be compelling to others. Now, back to MIPS assembly coding. 🙂
By the way, popularity does not constitute empirical evidence of superior suitability for a task. Conflating Popularity with metrics like productivity (which is also hard to define), “ease of learning”, or “ease of use”, “ease of collaboration”, etc. is a mistake without rigorous support for equating them.