← New search

Other meanings of Lisp (programming language)

Programming languages

Lisp (programming language)

Lisp is a family of programming languages, first specified by John McCarthy in 1958. Its central ideas include symbolic expressions, lists as a fundamental data structure, uniform code-and-data representation, and extensive use of recursion and metaprogramming.

1958
first specified
John McCarthy
2
core syntactic forms
atoms and lists
1959
first implementation
IBM 704
1

Definition and origins

Lisp began as a language for symbolic computation and artificial intelligence, rather than as a general-purpose language designed around numeric calculation. John McCarthy specified its basic design in 1958 while working at the Massachusetts Institute of Technology, and the first implementation followed on an IBM 704 under the direction of Steve Russell.1 Lisp programs are written as symbolic expressions, or s-expressions, whose parenthesized structure can represent both data and executable forms. A list such as (+ 2 3) denotes an operation applied to arguments, while quoted lists can be manipulated as ordinary data. This close relationship between program text and data gave Lisp an unusually flexible foundation for interpreters, symbolic reasoning, and experimental language design.

The original language was called LISt Processor because list processing was its defining operation. Its early development was shaped by artificial-intelligence research, but Lisp soon became useful in theorem proving, natural-language research, computer algebra, and interactive programming. The language's semantics were never frozen into a single universal standard; instead, multiple dialects developed around shared concepts and differing libraries, evaluation rules, and implementation strategies.2

2

Core ideas and dialects

Lisp's most influential feature is homoiconicity: much of the language's source notation is itself a Lisp data structure. A program can therefore inspect, construct, transform, and compile code using the same list-processing operations used for other symbolic data. The special form quote prevents evaluation, while eval and macro systems support controlled manipulation of expressions. Lexical scope, higher-order functions, garbage collection, and interactive read-eval-print loops also became closely associated with modern Lisp practice.2

The family contains substantially different dialects. Scheme, created by Guy L. Steele Jr. and Gerald Jay Sussman, emphasizes a small core, lexical scoping, and proper tail recursion; successive reports define the language and its standard facilities.3 Common Lisp was standardized to consolidate features from several earlier MacLisp-derived systems and remains a large, extensible language with a standardized object system. Emacs Lisp powers the extensibility of GNU Emacs, while Clojure carries Lisp principles into the Java Virtual Machine ecosystem. Racket extends Scheme with language-oriented programming tools and a broad module and library system.

3

Influence and applications

Lisp influenced programming-language research by making abstraction, symbolic transformation, and interactive development central parts of everyday programming. Its macro systems can extend syntax at compile time, allowing domain-specific languages and concise declarative notations to be implemented within the host language. The approach influenced later systems including ML-family languages, Smalltalk, Julia, and macro facilities in languages such as Rust and modern JavaScript, although those languages do not otherwise belong to the Lisp family.4

Lisp implementations have supported applications ranging from automated theorem proving and expert systems to computer algebra, education, text editing, and scientific software. Common Lisp's Common Lisp Object System introduced multiple dispatch, generic functions, method combination, and a flexible class model into a standardized Lisp environment.5 GNU Emacs demonstrates another distinctive application: its editor behavior, commands, and extensions are largely programmable in Emacs Lisp, allowing users to reshape the environment without modifying its implementation language. Lisp's practical appeal has therefore often come from the programming environment as much as from the language syntax itself.

4

Lesser-known aspects

Lisp's apparent simplicity conceals several technical choices that had lasting consequences. The language was among the earliest prominent examples of automatic memory management through garbage collection, an idea developed in response to the difficulty of reclaiming temporary symbolic structures.6 Its original conditional construct, cond, and its list-oriented representation made recursive algorithms unusually direct, but early Lisp also exposed machine-specific details such as IBM 704 accumulator and memory conventions. The language's famous parentheses were not intended merely as visual decoration: they provide a uniform external representation that can be read by a relatively small parser and then processed by Lisp code.

Another less visible contribution is the tradition of treating a language as a programmable language laboratory. Lisp dialects have repeatedly served as test beds for continuations, object systems, lazy evaluation, hygienic macros, and language-embedded interpreters. Scheme's insistence on proper tail recursion made unbounded chains of procedure calls possible without consuming proportional stack space.3 Lisp's history is consequently not a single progression toward one standard, but a network of experiments that influenced both implementation technology and the theory of programming languages.

Glossary

S-expression
A symbolic expression, usually an atom or a parenthesized list, used as Lisp's primary textual and structural representation.
Homoiconicity
The property that a language represents significant parts of its program syntax using the language's own data structures.
Macro
A compile-time or expansion-time facility that transforms source expressions before ordinary evaluation.
REPL
A read-eval-print loop that repeatedly reads an expression, evaluates it, and displays the result.
Proper tail recursion
A guarantee that calls in tail position can execute without accumulating additional control-stack space.

The Lisp family has no single universally accepted membership list; dialects differ considerably while sharing historical and structural principles.