Est. 1958 Intermediate

LISP

One of the oldest high-level programming languages still in use, LISP pioneered the symbolic expression, automatic memory management, and the idea that code and data share the same form.

Created by John McCarthy

Paradigm Multi-paradigm: Functional, Procedural, Metaprogramming, Reflective
Typing Dynamic, Strong
First Appeared 1958
Latest Version ANSI Common Lisp standard (X3.226-1994); modern dialects and implementations actively maintained

LISP (historically stylized in all capitals, from “LISt Processor”) is one of the oldest high-level programming languages still in active use, second in age only to FORTRAN among languages with continuous lineage. Conceived by John McCarthy in 1958 and first described formally in 1960, LISP introduced a remarkable cluster of ideas that the rest of the programming world would spend decades catching up to: the treatment of source code as a manipulable data structure, automatic memory management through garbage collection, the conditional expression, first-class and higher-order functions, dynamic typing, and the interactive read-eval-print loop. More than a single language, LISP is the root of a sprawling family of dialects — Scheme, Common Lisp, Clojure, Racket, Emacs Lisp, and many others — bound together by a common syntax of parenthesized symbolic expressions and a shared philosophy that the boundary between program and data should be as thin as possible.

History & Origins

The Birth of an Idea

In the late 1950s, John McCarthy was working on problems in artificial intelligence and wanted a programming language suited to symbolic, non-numerical computation — manipulating expressions, logical formulas, and lists of symbols rather than crunching numbers. Existing languages such as FORTRAN were oriented toward numerical work and offered little support for the recursive, list-structured data that symbolic reasoning demanded.

McCarthy began designing LISP at MIT in 1958, drawing on several influences. The Information Processing Language (IPL), developed by Allen Newell, Cliff Shaw, and Herbert Simon, demonstrated the value of list processing for AI. Alonzo Church’s lambda calculus provided a mathematical foundation for anonymous functions and function application, which LISP adopted directly in its lambda notation. McCarthy had also experimented with adding list-processing facilities to FORTRAN (an effort called FLPL, the FORTRAN List Processing Language), an experience that informed LISP’s design.

The 1960 Paper and the Surprise of eval

In 1960, McCarthy published “Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I” in the Communications of the ACM. The paper was intended as a theoretical contribution: it defined a small set of primitive operations and used them to write eval, a function that could interpret LISP expressions, as a way of demonstrating the language’s mathematical elegance. McCarthy had not necessarily intended eval to be implemented directly.

It was McCarthy’s graduate student Steve Russell who recognized that eval was not merely a theoretical device but a specification for an interpreter. Russell hand-translated the eval function into machine code for the IBM 704, producing the first working LISP interpreter around 1960. This moment — turning a mathematical definition of a language into a running implementation of that same language — became one of the most celebrated stories in computing, and the idea of a self-describing “metacircular” interpreter remains central to how LISP is taught and understood.

LISP 1.5 and Early Spread

The “LISP 1.5 Programmer’s Manual”, published by MIT Press in 1962, documented the first version of the language to see broad distribution. LISP 1.5 spread to research institutions and spawned numerous implementations on different machines. Many early design decisions — such as the use of car and cdr for accessing parts of a list, names that derive from the IBM 704’s address and decrement registers — survive in LISP dialects to this day.

A Family of Dialects

Through the 1960s and 1970s, LISP fragmented into many dialects as different research groups extended it for their own machines and purposes. Maclisp, developed at MIT’s Project MAC beginning in the mid-1960s, became a powerful workhorse used to build the Macsyma computer algebra system and Terry Winograd’s SHRDLU. Interlisp, which grew out of BBN-LISP at Bolt, Beranek and Newman and later at Xerox PARC, pioneered the integrated programming environment with features like structure editing and the DWIM (“Do What I Mean”) error correction system. Dedicated LISP machines — computers with hardware and operating systems designed specifically to run LISP — were built and commercialized by companies such as Symbolics and Lisp Machines, Inc. in the late 1970s and 1980s.

Scheme and the Drive Toward Minimalism

In 1975, Gerald Jay Sussman and Guy L. Steele Jr. created Scheme at MIT. Scheme stripped LISP down to a small, clean core and introduced lexical scoping (rather than the dynamic scoping common in earlier dialects) and a uniform treatment of functions as first-class values. Scheme became enormously influential in computer science education — most famously through the textbook Structure and Interpretation of Computer Programs — and in programming-language research.

Consolidation into Common Lisp

By the early 1980s the proliferation of incompatible dialects was a problem. An effort led by Guy Steele and others sought to unify the MacLisp-derived dialects (Lisp Machine Lisp, Spice Lisp, NIL, S-1 Lisp, and others) into a single standard. The result was Common Lisp, documented in Steele’s “Common Lisp the Language” (1984), which served as a de facto standard. Formal standardization followed: the ANSI Common Lisp standard (ANSI X3.226-1994) was approved on December 8, 1994, produced by the ANSI X3J13 subcommittee. This remains the authoritative specification for Common Lisp.

Design Philosophy

Code as Data (Homoiconicity)

The defining characteristic of LISP is homoiconicity: programs are written using the same data structures the language manipulates. A LISP program is a collection of lists, and lists are LISP’s primary data structure. The expression (+ 1 2) is simultaneously a piece of code that adds two numbers and a list containing the symbol + and the numbers 1 and 2.

This identity between code and data has a profound consequence: LISP programs can read, generate, and transform other LISP programs as easily as they manipulate any other data. This is the foundation of LISP’s famously powerful macro system, which lets programmers extend the language itself by writing code that produces code at compile time.

Symbolic Expressions

LISP source is built from symbolic expressions (S-expressions), a uniform notation in which everything is either an atom (a symbol, number, or string) or a parenthesized list of expressions. Function calls use prefix notation — the operator comes first, inside parentheses:

1
2
3
(+ 1 2 3)            ; addition: returns 6
(* 4 (+ 2 3))        ; nesting: returns 20
(list 'a 'b 'c)      ; build a list: returns (A B C)

The famous proliferation of parentheses is the visible price of this uniformity. In exchange, LISP has essentially no syntax to learn beyond the S-expression: there is no operator precedence, no statement-versus-expression distinction, and no special grammar for control structures — everything is a function or special form applied to arguments.

The Interactive Environment

From its earliest days LISP was an interactive language. The read-eval-print loop (REPL) — read an expression, evaluate it, print the result, and repeat — let programmers experiment with code incrementally rather than compiling whole programs and running them from scratch. This interactive style, pioneered by LISP, is now standard in many modern languages.

Automatic Memory Management

LISP was the first language to feature automatic garbage collection, freeing programmers from manually allocating and deallocating memory. The first LISP environment around 1960 already included dynamic memory allocation and reclamation. Garbage collection is now a standard feature of most mainstream languages, but for decades it was a hallmark — and sometimes a performance challenge — of LISP systems.

Key Features

First-Class and Higher-Order Functions

Functions in LISP are values that can be stored in variables, passed as arguments, and returned from other functions:

1
2
3
;; mapcar applies a function to each element of a list
(mapcar (lambda (x) (* x x)) '(1 2 3 4 5))
;; returns (1 4 9 16 25)

The lambda form, taken directly from the lambda calculus, creates an anonymous function. This treatment of functions as ordinary data — radical in 1958 — is now common across the language landscape.

Macros and Metaprogramming

LISP macros operate on the unevaluated code passed to them, transforming it into new code before evaluation. Because that code is just a list, macros are written in the same language as everything else:

1
2
3
4
5
;; A simple macro that swaps the values of two variables
(defmacro swap (a b)
  `(let ((tmp ,a))
     (setf ,a ,b)
     (setf ,b tmp)))

This power to extend the language’s syntax and semantics from within the language itself is something few non-LISP languages match, and it is the main reason LISP programmers describe the language as “programmable.”

Recursion and List Processing

LISP encourages a recursive, list-oriented style of programming. The fundamental operations car (first element), cdr (rest of the list), and cons (build a list) compose into elegant recursive definitions:

1
2
3
4
5
;; Recursively compute the length of a list
(defun my-length (lst)
  (if (null lst)
      0
      (+ 1 (my-length (cdr lst)))))

Dynamic and Strong Typing

LISP is dynamically typed: variables hold values of any type, and types are checked at runtime rather than at compile time. It is also strongly typed in the sense that values carry their types and operations are checked — adding a number to a string raises an error rather than silently coercing. Common Lisp additionally offers optional type declarations that implementations can use to optimize performance.

The Common Lisp Object System (CLOS)

Common Lisp includes one of the most powerful object systems ever standardized, CLOS. It supports multiple inheritance, multiple dispatch (methods selected based on the types of all their arguments, not just one receiver), and a “metaobject protocol” that lets programmers customize the behavior of the object system itself. CLOS influenced object-oriented design in many later languages.

Evolution

LISP’s evolution is best understood as the branching of a family tree rather than the linear progression of a single language. The original LISP 1.5 gave rise to two great branches that dominate today.

The Common Lisp branch consolidated the industrial, feature-rich dialects of the 1970s and 1980s into a single large, pragmatic, ANSI-standardized language. Modern open-source implementations such as SBCL (Steel Bank Common Lisp, forked from CMUCL in 1999) compile to efficient native code and remain under active development, alongside commercial implementations like Allegro CL and LispWorks.

The Scheme branch pursued minimalism and theoretical clarity, producing a series of standards (the R*RS reports) and ultimately spawning Racket, which was renamed from PLT Scheme in 2010 and grew into a platform for creating new programming languages.

A third, more recent wave brought LISP ideas to mainstream runtimes. Clojure, released by Rich Hickey in 2007, is a LISP dialect that runs on the Java Virtual Machine (with ClojureScript targeting JavaScript) and emphasizes immutable data structures and practical concurrency. It introduced LISP to a large audience of developers who might never have encountered Common Lisp or Scheme.

Current Relevance

LISP is no longer a mainstream choice for general application development, but its dialects remain genuinely active rather than purely historical. Clojure has a substantial professional following, particularly in data engineering and backend services, and appears regularly in developer surveys. Common Lisp retains a dedicated community, modern implementations, a package ecosystem (Quicklisp), and ongoing use in specialized domains. Emacs Lisp is run by everyone using GNU Emacs, making it one of the most-executed LISP dialects in daily practice. Racket and Scheme remain prominent in education and language research.

The community sustains conferences (such as the European Lisp Symposium), active forums, and a steady stream of libraries and tooling. While the LISP machine era is long over and LISP no longer dominates AI as it once did, the language family is far from extinct — it occupies a respected niche valued for interactivity, expressiveness, and metaprogramming power.

Why It Matters

Few languages have contributed as many enduring ideas to computing as LISP. The conditional expression, garbage collection, first-class functions, the REPL, tree-structured data, and the treatment of code as data all appeared in LISP first or were popularized by it, and have since spread throughout the field. Programmers using list comprehensions in Python, closures in JavaScript, or pattern-matching in functional languages are working with concepts LISP introduced decades earlier.

LISP also shaped the culture and methodology of computer science. Its self-interpreting eval made the deep relationship between a language and its implementation concrete, and the metacircular evaluator became a foundational teaching tool. The language’s macro system established the idea that a language could be a medium for building other languages — a perspective that resonates in today’s interest in domain-specific languages and language-oriented programming.

For nearly seventy years, LISP has served as both a practical tool and a kind of intellectual touchstone — the language that demonstrated, again and again, how much expressive power can flow from a few simple, uniform ideas. Its parentheses have outlasted countless trends, and its influence is woven so deeply into modern programming that much of it is now invisible, taken for granted as simply the way languages work.

Timeline

1958
John McCarthy began designing LISP at the Massachusetts Institute of Technology (MIT), seeking a language for symbolic computation and artificial intelligence research based on lists as the central data structure. Implementation work began in the autumn of 1958.
1960
McCarthy published the foundational paper 'Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I' in Communications of the ACM, defining LISP's mathematical core. Around this time Steve Russell hand-compiled McCarthy's theoretical 'eval' function, producing the first working LISP interpreter on the IBM 704.
1962
The 'LISP 1.5 Programmer's Manual' was published by MIT Press. LISP 1.5 became the first widely distributed version of the language and the basis for many subsequent dialects.
1966
Maclisp development began at MIT's Project MAC. It became one of the most influential early dialects, used to build major systems such as the Macsyma computer algebra program and the SHRDLU natural-language understanding system.
1975
Gerald Jay Sussman and Guy L. Steele Jr. created Scheme at MIT, a minimalist LISP dialect that emphasized lexical scoping and first-class functions. Scheme became enormously influential in programming-language research and education.
1981
Interlisp, which had evolved from BBN-LISP developed at Bolt, Beranek and Newman and Xerox PARC, was documented and widely used through the Interlisp-D environment on Xerox Lisp machines, pioneering integrated programming environments.
1984
Guy Steele published 'Common Lisp the Language' (CLtL), which served as the de facto specification unifying the fragmented family of MacLisp-derived dialects into Common Lisp.
1994
The ANSI Common Lisp standard (ANSI X3.226-1994, later INCITS 226-1994) was approved on December 8, 1994, formalized by the X3J13 subcommittee. It remains the authoritative standard for Common Lisp.
1999
Steel Bank Common Lisp (SBCL) was forked from CMUCL. It grew into one of the most widely used open-source, high-performance Common Lisp implementations and continues to be actively developed.
2007
Rich Hickey publicly released Clojure, a modern LISP dialect targeting the Java Virtual Machine with an emphasis on immutability and concurrency. It brought LISP ideas to a new generation of developers.
2010
PLT Scheme was renamed Racket, reflecting its evolution into a full language-oriented programming platform descended from the Scheme branch of the LISP family.

Notable Uses & Legacy

GNU Emacs

The Emacs text editor is built around Emacs Lisp, a LISP dialect used to implement and extend nearly all of the editor's behavior. Decades of user customizations and packages are written in Emacs Lisp, making it one of the most widely deployed LISP environments in the world.

Autodesk AutoCAD

AutoCAD has embedded AutoLISP, a LISP dialect, since 1986 as its primary user-facing customization language. Architects and engineers use it to automate drawing tasks and define new CAD commands directly inside the application.

ITA Software (Google Flights)

ITA Software built its airfare search and pricing engine, QPX, largely in Common Lisp. The system powered flight search for major airlines and travel sites; ITA was acquired by Google in 2011 and its technology underpinned Google Flights.

Naughty Dog game studio

Naughty Dog built custom LISP dialects for game development — GOOL (Game Oriented Object Lisp) for the Crash Bandicoot games and its successor GOAL (Game Oriented Assembly Lisp) for the Jak and Daxter series — demonstrating LISP's use in performance-sensitive game development on the PlayStation.

Macsyma and Maxima

Macsyma, one of the earliest and most influential computer algebra systems, was written in Maclisp at MIT. Its open-source descendant, Maxima, continues to be maintained on top of Common Lisp implementations.

Artificial intelligence research

LISP was the dominant language of AI research for decades, used to build expert systems, knowledge-representation systems such as Cyc, the SHRDLU natural-language program, and numerous symbolic-reasoning projects in academia and industry.

Language Influence

Influenced By

IPL Lambda calculus FORTRAN

Running Today

Run examples using the official Docker image:

docker pull
Last updated: