Paradigm | multi-paradigm: concurrent, functional |
---|---|
Designed by | Robert Virding |
Developer | Robert Virding |
First appeared | 2008 |
Stable release |
v1.1.1 / 19 June 2016
|
Typing discipline | dynamic, strong |
License | Apache License 2.0 |
Filename extensions | .lfe .hrl |
Website | lfe |
Influenced by | |
Erlang, Common Lisp, MACLISP, Scheme, Elixir, Clojure, Hy | |
Influenced | |
Joxa, Concurrent Schemer |
LFE (Lisp Flavored Erlang) is a functional, concurrent, general-purpose programming language and Lisp dialect built on top of Core Erlang and the Erlang Virtual Machine (BEAM). LFE builds on top of Erlang in order to provide a Lisp syntax for writing distributed, fault-tolerant, soft real-time, non-stop applications. LFE also extends Erlang to support meta-programming with Lisp macros and an improved developer experience with a feature-rich REPL. LFE is actively supported on all recent releases of Erlang; the oldest version of Erlang supported is R14.
Initial work on LFE began in 2007, when Robert Virding started creating a prototype of Lisp running on Erlang. This work was focused primarily on parsing and exploring what an implementation might look like; no version control system was being used at the time, so tracking exact initial dates is somewhat problematic.
Robert Virding announced the first release of LFE on the "Erlang Questions" mail list in March 2008. This release of LFE was very limited: it did not handle recursive letrec
s, binary
s, receive
, or try
; it also did not support a Lisp shell.
Initial development of LFE was done with version R12B-0 of Erlang on a Dell XPS laptop.
Robert Virding has stated that there were a number of reasons why he started the LFE programming language:.
Like Lisp, LFE is an expression-oriented language. Unlike non-homoiconic programming languages, Lisps make no or little syntactic distinction between "expressions" and "statements": all code and data are written as expressions. LFE brought homoiconicity to the Erlang VM.
In LFE, the list data type is written with its elements separated by whitespace, and surrounded by parentheses. For example, (list 1 2 'foo)
is a list whose elements are the integers 1
and 2
, and the atom foo
. These values are implicitly typed: they are respectively two integers and a Lisp-specific data type called a "symbolic atom", and do not have to be declared as such.