12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- December 2001 (rev. May 2002)
- (This article came about in response to some questions on
- the LL1 mailing list. It is now
- incorporated in Revenge of the Nerds.)When McCarthy designed Lisp in the late 1950s, it was
- a 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-else
- construct. We take these for granted now. They were
- invented
- by McCarthy in the course of developing Lisp.
- (Fortran at that time only had a conditional
- goto, closely based on the branch instruction in the
- underlying hardware.) McCarthy, who was on the Algol committee, got
- conditionals into Algol, whence they spread to most other
- languages.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 concept
- before Lisp of course, but Lisp was the first programming language to support
- it. (It's arguably implicit in making functions first class
- objects.)4. A new concept of variables. In Lisp, all variables
- are effectively pointers. Values are what
- have types, not variables, and assigning or binding
- variables 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 expressions
- can return multiple values.) This is in contrast to Fortran
- and most succeeding languages, which distinguish between
- expressions and statements.It was natural to have this
- distinction in Fortran because (not surprisingly in a language
- where the input format was punched cards) the language was
- line-oriented. You could not nest statements. And
- so while you needed expressions for math to work, there was
- no point in making anything else return a value, because
- there could not be anything waiting for it.This limitation
- went away with the arrival of block-structured languages,
- but by then it was too late. The distinction between
- expressions 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 can
- compose 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 that
- you can test equality by comparing a pointer.8. A notation for code using trees of symbols.9. The whole language always available.
- There is
- no real distinction between read-time, compile-time, and runtime.
- You can compile or run code while reading, read or run code
- while 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; compiling
- at runtime is the basis of Lisp's use as an extension
- language in programs like Emacs; and reading at runtime
- enables programs to communicate using s-expressions, an
- idea recently reinvented as XML.
- When Lisp was first invented, all these ideas were far
- removed from ordinary programming practice, which was
- dictated largely by the hardware available in the late 1950s.Over time, the default language, embodied
- in a succession of popular languages, has
- gradually 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 be
- any syntax for it.
- 8, which (with 9) is what makes Lisp macros
- possible, 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 only
- to have designed a new dialect of Lisp ; -)Though useful to present-day programmers, it's
- strange to describe Lisp in terms of its
- variation from the random expedients other languages
- adopted. That was not, probably, how McCarthy
- thought of it. Lisp wasn't designed to fix the mistakes
- in Fortran; it came about more as the byproduct of an
- attempt to axiomatize computation.
|