December 2001 (rev. May 2002)(This article came about in response to some questions onthe LL1 mailing list. It is nowincorporated in Revenge of the Nerds.)When McCarthy designed Lisp in the late 1950s, it wasa radical departure from existing languages,the most important of which was Fortran.Lisp embodied nine new ideas:1. Conditionals. A conditional is an if-then-elseconstruct. We take these for granted now. They were inventedby McCarthy in the course of developing Lisp. (Fortran at that time only had a conditionalgoto, closely based on the branch instruction in the underlying hardware.) McCarthy, who was on the Algol committee, gotconditionals into Algol, whence they spread to most otherlanguages.2. A function type. In Lisp, functions are first class objects-- they're a data type just like integers, strings,etc, and have a literal representation, can be stored in variables,can be passed as arguments, and so on.3. Recursion. Recursion existed as a mathematical conceptbefore Lisp of course, but Lisp was the first programming language to supportit. (It's arguably implicit in making functions first classobjects.)4. A new concept of variables. In Lisp, all variablesare effectively pointers. Values are whathave types, not variables, and assigning or bindingvariables means copying pointers, not what they point to.5. Garbage-collection.6. Programs composed of expressions. Lisp programs are trees of expressions, each of which returns a value. (In some Lisps expressionscan return multiple values.) This is in contrast to Fortranand most succeeding languages, which distinguish betweenexpressions and statements.It was natural to have thisdistinction in Fortran because (not surprisingly in a languagewhere the input format was punched cards) the language wasline-oriented. You could not nest statements. Andso while you needed expressions for math to work, there wasno point in making anything else return a value, becausethere could not be anything waiting for it.This limitationwent away with the arrival of block-structured languages,but by then it was too late. The distinction betweenexpressions and statements was entrenched. It spread from Fortran into Algol and thence to both their descendants.When a language is made entirely of expressions, you cancompose expressions however you want. You can say either(using Arc syntax)(if foo (= x 1) (= x 2))or(= x (if foo 1 2))7. A symbol type. Symbols differ from strings in thatyou can test equality by comparing a pointer.8. A notation for code using trees of symbols.9. The whole language always available. There isno real distinction between read-time, compile-time, and runtime.You can compile or run code while reading, read or run codewhile compiling, and read or compile code at runtime.Running code at read-time lets users reprogram Lisp's syntax;running code at compile-time is the basis of macros; compilingat runtime is the basis of Lisp's use as an extensionlanguage in programs like Emacs; and reading at runtimeenables programs to communicate using s-expressions, anidea recently reinvented as XML.When Lisp was first invented, all these ideas were farremoved from ordinary programming practice, which wasdictated largely by the hardware available in the late 1950s.Over time, the default language, embodiedin a succession of popular languages, hasgradually evolved toward Lisp. 1-5 are now widespread.6 is starting to appear in the mainstream.Python has a form of 7, though there doesn't seem to beany syntax for it. 8, which (with 9) is what makes Lisp macrospossible, is so far still unique to Lisp,perhaps because (a) it requires those parens, or something just as bad, and (b) if you add that final increment of power, you can no longer claim to have invented a new language, but onlyto have designed a new dialect of Lisp ; -)Though useful to present-day programmers, it'sstrange to describe Lisp in terms of itsvariation from the random expedients other languagesadopted. That was not, probably, how McCarthythought of it. Lisp wasn't designed to fix the mistakesin Fortran; it came about more as the byproduct of anattempt to axiomatize computation.