Practical Common Lisp
Gary Cornell of Apress has an interesting blog entry concerning his decision to sponsor a book about Lisp, which is according to Gary a book other publishers give as an example of something they don't want. See http://blogs.apress.com/archives/000492.php?author=gary_cornell
Gary is right. I've never programmed in Lisp but when I started out I read John McCarthy's article on Lisp in Saul Rosen's 1968 collection "Programming Systems and Languages" and its value was apparent.
Basically, what we're doing in OOD is trying to replace big and complex things not by means of the usual nonsense, where the complexity is dumbed-down, but by replacing them with the appropriate simple concept (*begriff*) which we then learn to deal with.
Lisp pioneered this by being unlike Fortran recursive not by accident: a list is a list, and the head of a list is a proto-object, which can encapsulate and UNBOUNDED level of complexity.
Whereas take the usual Fortran program (please). It is a fug of arrays in all too many cases, where those arrays are never what they seem.
Sometimes they are arrays of data, but in many cases they represent through an implicit (that is undocumented) encoding some shadowy reality which the maintenance programmer dimly groks only after much pain.
In ordinary MIS programming we learned to abstract and to form concepts by default because in American business, the boss tells you what to do and you do it. It was only after some time, for example, that creating subroutines not so much to save memory as to purely abstract but to show the structure of the problem in the code became something that wasn't a termination offense.
Many programs want to be Lisp when they grow up. In modifying the original prototype compiler for Build Your Own I realized that I needed to implement not VBA (in which all variables are untyped Variants) but the far more usable structure of Quick Basic which was a prototype for early VB, and in this a variable has a semi-recursive structure...easily serialized by parenthesized expressions strangely Lisp like.
The problem is that major commercial languages refuse to do two things.
They refuse to make all entities of interest to the competent programmer, notably data types, into first-class objects that can be treated just like data. They also fail as I note in my book to make it easy to use the compiler at run time.
They create a class distinction which gets in the way of effective problem solving because in their image, the programmer is the end of the value chain and at the end ideally issues a minimum of high level instructions to the machine.
The answer in macro environments has been E. F. Hobsbawms "anarchy of the lower middle class", in which script kiddies create completely unmaintainable Web sites and Access macros using VBA, where any variable can be anything at any time.
Even in VB.Net, I had to create my own parser for Lisp-like expressions.
At my day job, I've completed an interval object which represents both simple intervals of integer or real numbers and compound sets of intervals which are closed under the concept interval, because it makes sense in all contexts to downsize the compound interval ([3,4],[10,20],[56,57]) into the simple interval ([3,57]) as long as you realize that you have lost "signal" in the form of the non-membership of the gaps ([5,9],[21,55]).
The object supports, in VB.Net, an intervalCalculus which is able to do things like return the interval "between" two intervals and the interval that is the "overlap" between two intervals.
There are fascinating subtleties. Two intervals, considered to be of integer type, can be adjacent such that the end+1 of the left interval is equal to the start-1 of the right interval: but if you change the interval type to real, the possibility of this integer adjacency disappears, to the replaced by the possibility of tangency.
Suppose [1,3] and [3,5] are integers (as is shown in the notation and supported in the object's deserializer by square brackets). They aren't adjacent but instead they overlap. But consider them as real numbers.
Their overlap turns into tangency at a real point in continuous space. That is, you use INTEGERS when you are a "particle physicist" and measuring "quanta" envisioned as having mass, you use REAL when your points are true points in a continuous, Euclidean, Newtonian space.
Lisp could have handled the development of the interval object in a much smaller time, I think, because there would have been no need to develop an (admittedly simple) recursive descent parser for deserializing interval expressions such as between(overlap([1,10],[8,15]), [11,1])
Lisp was probably the first system to make the compiler and data types fully available at run time. About the only problem I have with Lisp is the complete absence of usable implementations for real work and the fact that its inventor, John McCarthy, is today a neocon nutbar.
McCarthy
He's identified as right-wing in his Wikipedia entry.
Unlike many "famous" people McCarthy at least used to post to usenet. Many famous people don't post to usenet because the guys on usenet are delighted to harass anyone who seems to be a "name". The lion will not touch the true prince, said Falstaff: but jackals will.
I had some interesting exchanges with McCarthy around the time of the first Iraq war.
During an interview for my book, Peter Neumann, the risks moderator, had some very interesting things to say about McCarthy. Suffice it to say that Peter is much more an admirer of Dijkstra, and that Peter Neumann is a good egg. Suffice it to say that good eggs admire other good eggs, and eschew low company. As Emily Dickinson said, the Soul selects her own Society.
Need I say more?
Visual Basic, and most other commercial languages, are in Max Horkheimer's sense "psychoanalysis in reverse" whereas merely reading about Lisp calms the mind, and brings to mind the recursive ontology of software, an ontology in which all things are just code, and Spinoza's monism applies.


Quotable Lisp
While searching for amplification on the closing tantalizing description ("neocon nutbar"), I ran across some interesting quotes which seem to confirm E.N's observations. (I didn't, however, devote enough time to find the answer I originally sought. Maybe some details are better left unknown.)
"Lisp has jokingly been called "the most intelligent way to misuse a computer". I think that description is a great compliment because it transmits the full flavor of liberation: it has assisted a number of our most gifted fellow humans in thinking previously impossible thoughts." - Edsger Dijkstra, CACM, 15:10
"Lisp is a programmer amplifier." - Martin Rodgers (first said by Chuck Moore about Forth)
"Lisp is worth learning for the profound enlightenment experience you will have when you finally get it; that experience will make you a better programmer for the rest of your days, even if you never actually use Lisp itself a lot." - Eric Raymond, "How to Become a Hacker"
"Lisp isn't a language, it's a building material." - Alan Kay