Hmm… it seems that the “Java = SUV of programming languages” posting has stirred up a bit of controversy over at Slashdot and right here on this server. Some people read it as a personal endorsement of PHP, VB, and other semi-baked programming languages. Actually my personal preference is a much darker, uglier, and more shameful secret: Common Lisp, CLOS, plus an ML-like type inferencing compiler/error checker (with some things done in a sublanguage with Haskell semantics and Lisp syntax). Common Lisp dates from around 1982 and ML from 1984.
I try to keep this preference concealed from young people who’ve been raised on a diet of C, Java, C#, Perl, etc. They just wouldn’t find it credible that 20-year-old systems and ideas are actually better than the latest and greatest from Microsoft and Sun.
Imagine my delight in running into a friend yesterday. She’s a 23-year-old graduate student in computer science at Harvard. Conversation rolled around to programming tools. Unprompted she said “What I think would be best is Common Lisp Object System with a modern type system”. I was stunned. I thought it was only dinosaurs like me that clung to Lisp.
I had a second ephiphany for the week… Believing that Lisp circa 1982 plus some mid-1980s ML tricks thrown in is better than all of the new programming tools (C#, Java) that have been built since then is sort of like being a Holocaust denier.
Actually, making the assertion that Lisp + (some other fairly well established constructs such as OO , a la CLOS) is better for developing nearly any size app seems to me to be the converse of being a Holocaust denier. A holocaust denier is someone denying a (well-known) truth. Knowing Lisp is the pinnacle of programming enlightenment is affirming a (less well-known) truth.
Yes, being a Holocaust denier is unpopular, as is being a Lisp/functional language supporter, but that’s about the only parallel, IMO
On a train ride to Washington DC last March I met a senior undergraduate majoring in Computer Science at Princeton. I was surprised to learn that he had never used a functional programming language such as Lisp or Scheme. I mistakenly believed that any CS major would be required to learn a few different programming languages, such as LISP, Prolog and C.
The problem with Lisp not being accepted boils down to one thing I think, and that’s the difficulty of applying it. Search for “building websites lisp” on google and you don’t really get a single hit back explaining what (free) software you can go grab and start writing a web app that interfaces into a database.
I can see the power of Lisp, but I have yet to be able to use it anywhere because of the difficulty (well, maybe not difficulty but obscurity) of setting up an environment with a lisp-enabled web server that can talk to a database. Most open-source tools (and closed source for that matter) fall into this trap. If a user is curious about something, then you better have something they can be up and running with in about 15 minutes or they are going to go back to what they know and are productive in.
Rob Meyer,
Just for fun, I googled “building websites java”, and tried the first few English-language links. I don’t think I could have gotten a Java servlet container up and running in 15 minutes. I certainly couldn’t have had a working database-driven page up in that time. Nonetheless, a lot of people put in the effort to learn Java-based web/database programming. How does that fit with your theory?
If somebody already does have a servlet container up and JDBC working, using Scheme for db-driven web apps is easy. Just unpack learnbrl.war in the webapps directory and play around with the files. They can be doing something interesting in 15 minutes, I’m sure. However, I’d recommend spending an hour with the manual, half that time in the “Understanding BRL inside-out” section, in order to really be productive with it.
An example one-page web app: http://brlewis.com/map/.brl
Just for fun, I googled “building websites lisp” and hit #2 was “Creating Dynamic Websites with Lisp and Apache” at http://lisp.t2100cdt.kippona.net/lispy/home
There’s a whole bunch of stuff to download (we’re working on tools to automate this stuff; it gets better all the time) but it’s reasonably straigtforward and all free-as-in-religion. And runs in CMUCL, which might not be exactly the sexpy Haskell you’re looking for but is at least a Lisp compiler with type inferencing
For more info, start at http://www.cliki.net/Web – yes, that’s a Lisp-based site too
Maybe there would be more Lisp/functional web tools if there was a commercial market for such things (anyone remember Dynamorph?). It’s a bummer to have to rely on SourceForge for innovation– you just know the documentation is going to be terrible.
Why yes, I do remember Dynamorph (and had the misfortune of building a commercial web app in it). I can’t imagine why anyone would prefer it to, say, PHP, even if you’re a fan of the functional style. After all, Dynamorph (at the time I used it) didn’t even have _functions_.
Strict ML-style type systems (where the compiler *must* be able to prove the type of every variable or it won’t let you run the program) are not compatable with the Lisp way of doing things. But having a compiler that tries reasonably hard to do type inferencing and then throws in a runtime check if it fails is a pretty good compromise.
CMUCL does a pretty nice job of that on standard Common Lisp, but if you don’t mind dropping the parens then the Dylan language is designed to encourage the sort of coding style that make type inferencing easierm while not scaring C++/Java programmers *too* much.
Once again, Phil’s trying to be offensive. Instead of saying they were like Flat-Earthers or Creationists, Dr. Philip decided to throw in the Holocaust for good measure. It’s getting a bit old, buddy.
If somebody, somewhere, would build an Eclipse plugin that handled CL, I’d be pretty damn happy. It would be cool to play with.
The only problem with Lisp, for me, is the lack of signposts in the language. There’s too little structure to draw the eye in and make comprehension easier. It’s like trying to write without punctuation marks.
If we replace XML with Lisp, we would get web services that practically run themselves using 30-year-old technology.
I can’t believe MIT tolerates HTML in Computer “Science”. Ten years ago, C was only taught in Civil Engineering instead of Computer Science because it was about “programming”, not “problem solving.” Doing anything with HTML/XML, that just makes any problem 10x worse.
Besides, if we all conspire to go back to Lisp, that would create a new boom and new jobs.
After working with RDF for a time, I do find Lisp more palatable, but again, there are no perfect programming languages. To each its own strengths.
You do tend to deliberately provoke and antagonize, so I gather you must like the buzz you get. I imagine it keeps you famous, too. Still, equating programming languages likes and dislikes with the Holocaust was tacky, tasteless, and rather disappointing in its graceless ploy for attention– you offered a lot more at first reading.
Pity.
You might want to check out this article by Paul Graham in which he asserts that all the scripting languages are evolving to be more and more like Lisp. Quote: “If you look at these languages in order, Java, Perl, Python, you notice an interesting pattern…Each one is progressively more like Lisp.”
Are going going back to the future?
Lisp is an excellent language for developing complex systems and systems that evolve over time. It matches beautifully the emerging agile/prototyping methodologies of developing software – that might actually meet users’ needs and in a timely fashion. Type inference would add further strength, catching a few more errors before deployment. Note, however, Test Driven Development is quite good at catching errors early too. Note, also, Qi http://www.simulys.com/guideto.htm adds type inferencing to Lisp (isn’t Lisp wonderfully extensible?).
There appear to be two (loosely) viable commercial Lisps. Franz’s Allegro – powerful, complete and very expensive. Xanalys’s LispWorks – not (sufficiently) complete yet attractively priced. Of course your deployment platform influences, and for me since Windows is 90% of desktops and 50% of servers, Windows interop is the key.
All non-commercial Lisps are sadly lacking on the Windows deployment and interop front (COM, .NET, ActiveX etc.).
Alex: Have you looked at Corman Common Lisp (http://www.cormanlisp.com/index.html)? It’s a Windows-based commercial Lisp, but cheaper than LispWorks. I don’t know if it has all the features you name, but there’s been some effort to make it integrate well with Windows.
Philip: Your friend is not alone. I am a 25-year-old graduate student, and my favorite language is Common Lisp. I have seen no programming construct as powerful or interesting as Lisp macros.
Even within AI, however, only a few of my friends grok Lisp. Sometimes, in dark moments, I wonder: is Lisp no longer the language of artificial intelligence?
It is forsure a VHS world when people flock to XML, XML namespaces, XML parsing, and DOM and then flinch at a parenthesis.
I’m hoping that a new Lisp will emerge. Common Lisp fossilized during the Reagan administration — with compromise among commercial vendors aiming to support legacy customer code from the ’70s on platforms that no longer exist as one of their highest priorities.
Even so, the ideas underlying Common Lisp and many of the “do the right thing”-style features of the language make it about the most interesting and powerful language in existence.
I can’t help thinking, though, that keeping the great ideas but throwing the old legacy ballast overboard and starting anew with just the ideas and the realities of today’s world and creating a really powerful, free implementation could breathe new life into a programming world that only seems capable of retrofitting watered-down Lisp ideas into watered-down languages. (Maybe borrow some of the OCaml ideas and get those implementers to do the compilers. 😉 )
It’s not just dinosaurs like you. There are many people learning Lisp (CL in particular) and finding it a fairly good tool for most tasks.
IMHO one of the main obstacles to widespread adoption is CLs
obsession with reinventing everything, instead of actually trying to interface with existing code. Yes, Qt or GTK might not be ultimate achievements in UI framework design, but they are there, they work and the users are used to them. Now go and try to use them from within CL. Say, CMUCL or SBCL.
This is just an example — the real problem is much larger.
But the language itself is definitely getting a second breath recently.
Phil must have been hacked. What the hell is a modern type system and why would you want one in Lisp? “Type inferencing” sounds like something that could start a flame war among old lisp hackers. It’s totally uncharacteristic of philg to leave it unexplained for those of us who only have physics degrees.
It’s a pretty good trolling impersonation, though: if the last sentence had come early on, and been justified with a really insightful argument, explained without resorting to CS jargon, I would never have suspected anything.
My personal preference is for Haskell, plus a Haskell-like type inferencing compiler/error checker (with some things done in a sublanguage with Haskell semantics and Haskell syntax). Haskell dates from around 1987.
I’m sure you know this, but you’re using incommensurate timelines: if you were to normalise them, you’d get C# and Java being about 30 years old, and all makes sense again.
I have recently fallen in love with Lisp (which includes Lisp, Schemr and T), and many of the problems that I can see with Lisp are more social in reference to programming languages. A common run-time library, CPAN (which is wasted on Perl), and an updating system (like dpkg, d-select, apt-get). Also there are problems (large problems in my opinion) that exist concerning the interoperabiltity of code between implementations of <insert dialect here>.
So it took me some time to decide whether I would try and unite the Lisp community with some of the things I mentioned above or try and evolve Lisp (would needs, and would be done eventually). I recently decided that I would start work on an implementation, currently named ‘Color’ (in reference to using a small amount of components to build a larger more beautiful image/language).
Now of course implementing another incompatible Lisp is not a direct or quick fix to the problem. I know this. So my focus is on the things I mentioned above. My goal is to implement a lisp with a good socket library, and OS interfacing faily quickly (woah, what a relative term that is) and release.
Also I felt that the implemented semantics and under-belly of the language should be able to be changed just as much as the syntax of any Lisp language can be (being that one should /only/ use the right tools for the job). I don’t think it is completely impossible to built a language around the ideas of a kernel dynamically loading device drivers. Why can’t someone better than I, develop an optimizing module to be plugged in and invoked when needed, or an assembler for the current machine port… it seems rather plausible and logical to me. Of course, I could be just to ‘young to know better.’
John,
It’s not that lispers are obsessed with reinventing everything; it’s just that many of the things were invented in Lisp long before the fashionable tools that everyone expects you to interoperate with have emerged.
Still, there are Lisp bindings for Qt and GTK around.
(sorry John, I was addressing Jan Rychter’s remark actually)
I thought Graham was working on a new lisp called Arc. How far along is Arc and how many people are working on It? I think threads and concurrency added to Lisp would
make it almost perfect!
mckinnemon:
Yes, I am completely fascinated with Arc, but the problem that I have is that there is no code to download. I personally would want to use Arc with the ideas that I have but I kind of need code in order to do that.
So as much as I appreciate and am excited by the ideas that Paul Graham has introduced, I am still considering Arc vaporware until I have code in my possesion. 😉
For those who don’t know, PLT-Scheme has threads, networking, COM, ODBC/database interfaces, XML parsers, OpenGL bindings, and more. Check it out at drscheme.org
Lisp is lovely.
It is too hard for most people
to use productively.
Some folks like that last fact;
it feeds their notion of being
“smart”.
Stan
It is disappointing that Arc is being developed in a cathedral-ish manner.
Like Emacs really.
It does not surprise me that Lisp remains unknown to most developers in the industry. I would even go as far as to say that even other languages with a more familiar syntax seem untouched by the masses (I am thinking Ocaml here.) As a matter of fact, I was horrified to hear the Sun chaps (Click & Hack brothers) say don’t use reflection. That says to me the majority of the developers are incapable of using powerful notions such as reflection, continuations etc. I don’t think Lisp or any other language of comparable power will ever take a strong hold with the masses of developers. The world has too many COBOL and VB programmers who are comfortable with the skills they have learned so far. The only silver lining I see is the C# offering from Microsoft(surprise!) which seems to be trying hard to figure out ways to introduce powerful notions in a language likely to be used by the masses.
Stan,
What are you talking about?
Story: I took a software engineering class in my freshman year of college. It consisted of three short C++ homeworks, and a large C++ project. Just for fun, I prototyped the last homework in Common Lisp before re-writing it in C++. At that point, I had been using C++ for four years and CL for four months. In Lisp, the assignment took approximately one hour to write and test, and took one page of code. In C++, it took over four hours and something like five or six pages.
Aside from this purely personal anecdote, I would like to refer you to an article by Peter Norvig on the subject: http://www.norvig.com/java-lisp.html
So, by and large, most people are very productive in Lisp. Writing more “real-world” programs that need application servers and databases tends to be more painful, since each Lisp implementations rolls its ownnetworking, multithreading, and foreign-function libraries (I know about CLOCC, but it does not support some important Common Lisps, namely OpenMCL).
CV
If you want something like: Scheme + a decent type system look no further: Bigloo is a Scheme system with the following features:
– Freedom of Scheme programming
– An object system, though, not as powerful as Common Lisp its object system
– /A type system if you need it/; this type system is easy to use
– Excellent performance and it is on par with OCaml in this respect!
– You can turn your Scheme code automatically into Java back-ends with the help of Bigloo
– Interfacing to C is easy; I would even go that far and say interfacing to C is easier than under Python for example
– Very important: you can easily produce stand-alones (“./a.out”)
– A development environment “Bee” based on Emacs
– This is only hearsay (I use Bigloo on Linux): it runs on: Linux, Unix, MacOSX, recently there has been made a port to Windows, and maybe some other flairs of Unix systems,…
– It is free just like as Python
I use Bigloo (nearly daily) for numerical computations instead of Fortran; I throwed away Python since I first encountered Bigloo. Bigloo feels always fast.
I was reading your blog with interest, as a java web programmer i like to keep my mind open and i found your comments interesting and thought provoking. Then i read the holocost comment.
Do you think holocost deniers are correct?
Because that is what your comment implies. Your preference of Lisp is unpopular and correct. Holocost denial is like your preference. Therefore holocost denial is unpopular and correct. Sure you use the words “sort of like” so you can weasel out of the comparison later. But if your comparison does not imply that the holocost is unpopular and correct, then what is the similarity that causes the two opinions to be “sort of like” each other. If you used this phrase simply to get a rise, you should bow you head in shame. To take the extermination of millions of people and to question its validity for shock value is disgusting. I have reported you to the AntiDefamation League. If you are simply ignorant, and do deny the holocost, state and defend your views outright on your blog. Your failure to address this will be evidence of your cowardice. Here’s a link you should read: http://www.adl.org/holocaust/introduction.asp
dave
David: I’m not a holocaust scholar, though I do have some photos up at http://www.photo.net/bp/dachau (also wrote a bit about this at the end of http://www.photo.net/samantha/samantha-XV); if the ADL calls I’ll be sure to ask them about the cleanest way to add ML-style type inferencing to Common Lisp….
ClimateChange: Bigloo looks interesting but the name seems unlikely to encourage adoption in the UK…
Philip,
As I recall, you used to use Lisp a great deal, and from time to time you write little half sentences about how Lisp is the best and then proceed to finish the thought by describing the real work you’re doing, none of which seems to be done in Lisp.
If you’ve used it so much in the past, you certainly know it well, and if you still love it so much, and still do a lot of software development, why don’t you actually USE it for most projects?
And this isn’t Lisp advocacy. I’m not telling you to use it. I’m wondering, as a guy considering learning Lisp, why you don’t. With so many thousands of “the best and brightest” having learned Lisp at schools like MIT over the years, and with many of them (you, Guy Steele at Sun, Peter Norvig at Google, etc.) in strategic positions in the software world, I wonder why the vast majority of you seem to have abandoned Lisp for languages you like less and consider less powerful.
If the thousands of you who know it best and used it the most aren’t interested in using it anymore, should I just skip ahead and lose interest in advance?
Why don’t I use Lisp for the “real work” I’m doing? Unless you count helicopter lessons, commercial airplane maneuver lessons, atmospheric physics classes, and drawing classes the only “real work” I’m doing is the 6.171 textbook and class. None of the things that we’re teaching the students are in any way related to an imperative programming language such as Lisp, Java, et al. The students already know how to use Lisp and Java from 6.001 and 6.170 and they know how to code a procedure and an IF statement. We concentrate on SQL and page flow.
Some of the less angry Java programmers in various comments talked about the libraries and tools that led them to choose Java. Sort of the same deal for me. In 1995 the most efficient and productive Web server was AOLserver and it had a Tcl interpreter compiled in rather than a Lisp compiler. So I used Tcl to tap into AOLserver’s API and database connection pooling. In 2003 the best tools for development and production seem to be part of Microsoft .NET. So I guess if I were forced to write code I’d suck it up and use C# in order to tap into the Microsoft library. But the verbosity of C# puts me off so I’d probably just write specs and hire guys in India to do the actual coding beyond the SQL data model and transactions….
It turns out that both the JVM and the Microsoft Common Runtime can’t support dynamic type systems such as Common Lisp Object System. But Microsoft’s raft of PhD CS nerds is aware of this and trying to improve it for the next version. So one day there might be an actual working Lisp.NET (they sort of did Scheme.NET and then gave up funding it, which is odd considering that MSFT is pushing towards $50 billion in the bank). If I could use ASP.NET with Lisp I’d go back to being a code monkey…
Thanks for the quick reply, Phil. I’m still pretty sure that I want to learn Lisp. I already have enough professional experience with C++, Java, Perl, and others that it won’t reduce my employability, but I do wish I had a clearer idea of why so many smart, experienced Lisp users seem to have given it up.
It appears from your reply and Peter Norvig’s comment that “Java is half as good for AI as Lisp, but that’s probably good enough”, that Lisp doesn’t have enough of an advantage as a language to overcome its disadvantages relative to Java, C++, or whatever, for most current software projects.
I’d like to know (from any former Lispers) if my supposition is correct and, if so, what disadvantages made them stop using Lisp. I can guess, of course, but I’d rather hear the judgment of experienced Lispers.
Whether or not it is worth learning Lisp really depends on what you’re doing. Web development is really SQL database programming unless you’re one of the 0.1% of folks who are using an object database as a source of persistence (in which case Java or Common Lisp/CLOS would become fantastically useful). So it isn’t surprising that anything that gets in the way of SQL programming is a hindrance.
By contrast our friends from the MIT AI Lab who built the Orbitz flight search engine were doing a fancy in-memory search (actually they did a lot more than Orbitz uses; visit http://www.itasoftware.com and try their own search engine with “advanced options”) and Lisp gave them a big leg-up.
If you’re doing polymer physics or other scientific/numerical simulations I think you’ll also find that Lisp gives you a big edge.
If you have to develop something that is algorithmically complex on a tight time/money budget Lisp is good.
If you want to develop a domain-specific language, Lisp is incredibly useful because you won’t have to design syntax or write a parser. You just document 25 procedures plus a few built-in operators and turn the users loose with one instruction: “(procedure-name arg1 arg2 … argN) where argI can itself be a procedure call”.
For simple systems, network, and business data processing programming you can often find Java or Perl libraries that solve 95% of the problem because so many other people who inhabit this dreary part of the IT landscape have been using Java and Perl. In that case it is definitely easier to suck it up and extend the library rather than try to be a purist and code it all from scratch in Lisp.
But read Abelson and Sussman’s book Structure and Interpretation of Computer Programs. You’ll learn a lot of computer science and, as an aside, learn to use Lisp as a notation for some of the ideas in the book. After that you might want to dirty your hands with Common Lisp which has all the grungy built-in functions that are useful for solving real-world problems and the beautifully conceived Common Lisp Object System, which is great for factoring out code.
Thanks again. I’m sold. I’m tired of that “dreary part of the IT landscape” anyway (though it’s not clear whether you meant to include your Web development in that category.)
Lisp continues to sound like a magic genie’s lamp, so I’m going to have to use it for a while to see for myself what all the fuss is about. I’ll work my way thru SICP, too. It’s still something of a mystery to me, though, why most of those best and brightest in CS who have mastered the lamp in the past seem to have put it in a box in the attic to gather dust with little more than a shrug.
But given the choice between flying helicopters and coding in Lisp, I’d probably opt for the helicopters, too. Ah, to be a Man of Leisure…. 😉
“It’s the macros, stupid.”
What is most interesting to me about this thread is that, in the fifty or so preceding
comments, the word “macro” appears only *once*. It is CL’s macro facility that makes it
magical. It is so utterly far beyond, outside, & unlike anything else in the programming
world that it’s impossible to describe. You just have to experience it.
Bigloo and its name ado(a)ption.
It is possibly off-topic, but I cannot see any reason why Bigloo’s name could be an impediment to an adoption. However, I am not a native speaker of English (hey I am Austrian and we speak German here) and cannot decide how Bigloo “rings in some native ears”.
A side note: Bigloo and OCaml (and therefore ML types) are strongly related. I mean the boss behind Bigloo is a scientist, who was former, during his PhD, in the OCaml project. OCaml and Bigloo come from the same institution INRIA (France) and they are sitting close together there.
I am not cheerleading Bigloo but it is a valuable tool for me (especially my private binding to the high quality plotting library DISLIN). However, I am more or less the “ass” in academia, though, I am not involved into computer science but I write my PhD in physics; it is simply not true that all scientists use Fortran. I find it much easier to use Scheme and functional programming languages (I learnt a bit functional programming under the regimes of “Clean”).
‘Bigloo’ sounds like ‘big loo’. ‘Loo’ is a slang Commonwealthish term for ‘toilet’. Hence, it sounds like ‘big toilet’.
As everyone pointed out, Lisp is cool and a pleasure to work with but it lacks standards things around as you have with java or php… You should have a look at XSLT :=) Basically it is a “kind of” functionnal langage to script web pages and used by tons of apps…
Re: eclipse CL plugin…
I put together a Scheme plugin for Eclipse based on JScheme at http://www.zclipse.org/projects/jscheme
Anonymous,
I wouldn’t try to compare Java/C# directly to Lisp/Scheme; the two types of languages are complimentary. Java/C# are very productive for the typical “bread and butter” programming tasks common in the industry today. But learning lisp is something you will never regret, because it improves your ability to think logically. I’m not kidding about this — learning Java is like learning to build a house or repair a car, and learning assembler language is like getting a crash course in CPU architecture — but learning lisp is like learning a new way to think, and it will enrich many areas of your life. Of course, you could take a few classes in predicate logic or read the Copi book instead; but for many people learning lisp is a good way to drill the concepts into the subconscious. I honestly think that all 12 year-old kids should be taught lisp, just for the positive effect in rewiring the brain.
Among the most educational experiences of my life was writing my own LISP interpreter. I had read about it in a magazine, perhaps Scientific American, and it seemed so natural and excellent. A few years later I had the use of a Wang computer with a built-in BASIC and a grand total of 8K bytes of memory. (That’s 8,000 with three zeros.) During the course of working it out, I had a grand illume that revealed the whole meaning of evaluation. It was like I should have jumped up and danced around singing The Rain in Spain or whatever. In retrospect that was the whole point of the exercise, and I would have glibly avoided confronting it in a course. I couldn’t do any ambitious AI projects with my interpreter, but it’s possible to work some simple puzzles if you have garbage collection.