LFE: The convergence of Lisp and Erlang traditions
graph TB
%% Lisp lineage
Lisp[Lisp<br/>John McCarthy<br/>1958]
CommonLisp[Common Lisp<br/>1984]
Scheme[Scheme<br/>Sussman & Steele<br/>1975]
FranzLisp[Franz Lisp<br/>~1980s]
PSL[Portable Standard Lisp<br/>~1980s]
Flavors[Lisp Machine Flavors<br/>~1980s]
%% Erlang lineage (complete from previous)
Prolog[Prolog<br/>1972]
PLEX[PLEX<br/>~1970s]
CSP[CSP<br/>1978]
Smalltalk[Smalltalk<br/>1971-1980]
Parlog[Parlog<br/>1986]
%% Erlang itself
Erlang[Erlang<br/>Armstrong, Virding, Williams<br/>1986-1998]
%% BEAM VM
BEAM[BEAM VM<br/>1993]
CoreErlang[Core Erlang<br/>2001]
%% LFE
LFE[LFE<br/>Robert Virding<br/>2007-2008]
%% Lisp lineage connections
Lisp --> CommonLisp
Lisp --> Scheme
Lisp --> FranzLisp
Lisp --> PSL
%% Erlang lineage connections
Prolog --> Erlang
PLEX --> Erlang
CSP -.theory.-> Erlang
Smalltalk -.messages.-> Erlang
Parlog -.concurrent logic.-> Erlang
%% BEAM evolution
Erlang --> BEAM
BEAM --> CoreErlang
%% LFE synthesis - from Lisp side
Maclisp --> LFE
CommonLisp -.Lisp-2, defun, macros.-> LFE
Scheme -.lexical scope, minimalism.-> LFE
%% LFE synthesis - from Erlang side
Erlang --> LFE
CoreErlang --> LFE
%% Virding's personal history
FranzLisp -.Virding's 1980-81 physics work.-> LFE
PSL -.Virding's Ericsson work.-> LFE
Flavors -.Virding's Flavors port.-> LFE
Parlog -.Virding's 1986 experiments.-> LFE
%% Key inheritances
Erlang -.concurrency, pattern matching, OTP.-> LFE
CommonLisp -.S-expressions, homoiconicity.-> LFE
BEAM -.runtime, hot code swap.-> LFE
%% Styling
classDef lispStyle fill:#81C784,stroke:#388E3C,color:#000
classDef erlangStyle fill:#EF5350,stroke:#C62828,color:#fff
classDef vmStyle fill:#90CAF9,stroke:#1976D2,color:#000
classDef theoryStyle fill:#E8EAF6,stroke:#5C6BC0,color:#000
classDef lfeStyle fill:#7C4DFF,stroke:#512DA8,color:#fff
classDef virdingStyle fill:#FFE082,stroke:#F9A825,color:#000
class Lisp,CommonLisp,Scheme lispStyle
class FranzLisp,PSL,Flavors virdingStyle
class Prolog,PLEX,Parlog erlangStyle
class CSP,Smalltalk theoryStyle
class Erlang erlangStyle
class BEAM,CoreErlang vmStyle
class LFE lfeStyle
LFE (Lisp Flavoured Erlang), initially developed in 2007 with first public release in March 2008 and stable version 1.0 in 2016, represents a unique synthesis in programming language history. Created by Robert Virding—one of Erlang's three co-inventors alongside Joe Armstrong and Mike Williams—LFE brings together two distinct lineages in a way no other language has attempted.
LFE inherits from the entire Lisp family: Original Lisp (1958) provides S-expressions, prefix notation, homoiconicity, first-class functions, recursion, garbage collection, and REPL interactive development. Common Lisp (1984) contributes the Lisp-2 architecture with separate namespaces for functions and variables (functions referenced with #'function-name/arity notation), syntax elements including defun, lambda, let/let*, quote, backquote and unquote for macro templates, and docstrings. Scheme (1975) influences the minimalist philosophy, lexical scoping considerations, and clean functional style. Virding stated LFE has "the feel of CL and Scheme, especially CL."
More remarkably, LFE inherits from Erlang (1986-1998) and transitively all of Erlang's influences. Core language semantics include pattern matching in function clauses and control structures, guards for refined pattern matching, multiple function clauses, immutable data structures with single assignment, eager evaluation, dynamic typing, and functions distinguished by name AND arity (making LFE a "Lisp-2+"). All standard Erlang data types are used: atoms, lists, tuples, maps, binaries, records, integers, floats, PIDs, and references.
The concurrency model is pure Erlang: lightweight processes with share-nothing architecture, asynchronous message passing between isolated processes with separate heaps, the receive construct for selective message handling, process spawning and linking, and minimal overhead supporting millions of concurrent processes (~300 words per process). The "let it crash" philosophy, supervision trees, process monitoring, hot code swapping, and fault tolerance mechanisms come directly from Erlang's telecommunications heritage. Full access to OTP (Open Telecom Platform) includes gen_server, gen_fsm/gen_statem, supervisor behaviors, and design patterns enabling nine-9's reliability (99.9999999% uptime).
Through Erlang, LFE indirectly inherits from Prolog (1972) via pattern matching and guard semantics, PLEX (1970s) via hot code swapping and fault tolerance, CSP (1978) via message passing operators, and Smalltalk (1972) via message-passing paradigms. The BEAM Virtual Machine (1992-1993) and Core Erlang (2001) intermediate representation provide LFE's runtime environment—LFE compiles through a three-pass compiler (macro expansion, linting, code generation) to produce 100% compatible Core Erlang code.
Virding's personal history shaped LFE's creation. He first encountered Lisp around 1980-81 as a theoretical physics PhD student at Stockholm University, where the physics department used Lisp for symbolic algebraic computations. At Ericsson Computer Science Lab in the 1980s, he ported Franz Lisp to VMS and implemented the Lisp Machine Flavors object system on Portable Standard Lisp (PSL)—work that inspired LFE's name. He also experimented with Parlog (1986), a concurrent logic programming language used with Nabiel Elshiewy in 1986 that influenced Erlang's concurrent features.
Virding created LFE from multiple motivations: a long-standing goal to make a Lisp specifically designed for BEAM, curiosity about what Lisp would look like built on Erlang's foundations and constraints, technical exploration of compiling another language by generating Core Erlang, personal interest as an "old lisper" wanting his own implementation, and simple love of language implementation as a spare-time project. He noted: "The combination of functions and macros—and the homoiconicity which makes working with macros easy—makes Lisp a very powerful tool. This makes Lisp and the concurrency from Erlang a very good combination."
LFE's unique innovations include pattern matching in macros (impossible in traditional Lisps), lambda-match for anonymous functions with pattern matching capabilities, homoiconicity brought to the BEAM VM (first Lisp on BEAM), and scoped variables in macros without gensym (unsafe in distributed, long-lived code). Zero-penalty Erlang function calls, seamless interoperability with thousands of existing Erlang libraries, and the ability to mix LFE and Erlang code in the same project make LFE fully compatible with vanilla Erlang while adding Lisp's "mad-scientist powers."
Virding noted in hindsight he would have named it "EFL" (Erlang Flavoured Lisp) rather than LFE, as it's truly "Erlang with a Lisp flavour"—the Erlang constraints and features heavily shape the Lisp design. LFE cannot support features requiring global data or destructive operations due to BEAM constraints, but this limitation enables the reliability and concurrency that made Erlang successful in telecommunications. As Virding observed, "Clojure feels more like language with concurrency while Erlang feels more like an operating system with a language"—and LFE brings Lisp syntax to that operating system.