LFE 2008
A homoiconic Lisp-2 with parentheses, macros, and the full power of the BEAM behind every form.
Influenced by: Erlang Elixir common lisp scheme maclisp clojure
LFE (Lisp Flavoured Erlang) is a Lisp dialect that compiles to Core Erlang and runs on the BEAM, giving Lisp's S-expression syntax and Common Lisp-style (unhygienic) macros first-class access to Erlang/OTP. It is a proper Lisp-2+ - separate namespaces for functions and values - that is homoiconic and dynamically, strongly typed, so code is data and metaprogramming is the native idiom. Because it emits 100% Erlang-compatible code, LFE modules call Erlang and OTP with zero penalty and can be mixed freely with Erlang and Elixir in the same release.
What makes it distinctive
- A true Lisp-2+ on the BEAM: separate namespaces for functions and variables, in the Common Lisp tradition rather than Scheme's single namespace.
- Homoiconic - code is written as the same S-expression data the language manipulates, making it natural to treat programs as data.
- Full Lisp macros bring compile-time metaprogramming to Erlang, something neither plain Erlang nor (originally) Elixir offered in this form.
- Compiles to Core Erlang, so it produces 100% Erlang-compatible BEAM code with zero-penalty calls into Erlang and OTP.
- Inherits Erlang's killer features for free: lightweight processes, message-passing concurrency, supervision trees, hot code loading, and the let-it-crash philosophy.
- Ships a feature-rich REPL that can define functions and macros interactively - a step beyond the standard Erlang shell.
- Created by an original co-inventor of Erlang, giving it deep authenticity within the BEAM family.
History
LFE was created by Robert Virding, one of the three original co-inventors of Erlang at the Ericsson Computer Science Laboratory and a contributor to much of the early standard library and the compiler. A long-time Lisp programmer, Virding set out to build a Lisp that was designed specifically for the BEAM and could interoperate fully with Erlang/OTP rather than being a Lisp bolted on top of it. Early experiments in 2007 were mostly about parsing and implementing a Lisp on the VM and served as a preamble to the real project.
Virding announced the first public release of LFE on the erlang-questions mailing list in March 2008, with development done against Erlang/OTP release R12B-0. That first cut was deliberately limited: it did not yet handle recursive letrec, binaries, receive, or try, and there was no Lisp shell - it was a Lisp syntax front-end to the Erlang compiler more than a complete environment.
Over the following years LFE matured into a self-hosted, feature-complete language with a real REPL that - unlike the standard Erlang shell - can define functions and macros interactively. After roughly eight years of development, LFE reached its milestone 1.0 release in March 2016, an event widely noted in the community (covered by InfoQ that April). The 1.0 line cemented LFE as a stable, production-grade Lisp on the BEAM; the project notes it had been used in stable production applications since 2015.
Development has continued steadily since. The 2.x series modernised the toolchain around rebar3 and hex.pm packaging and refined the macro system and shell. Notable later releases include 2.1.x (2023) and 2.2.0 (January 2025). Throughout, LFE has remained closely tied to Erlang itself: because it compiles to Core Erlang, advances in the Erlang compiler and OTP flow through to LFE, and LFE code coexists seamlessly with vanilla Erlang and, by extension, the wider BEAM ecosystem including Elixir.