An excerpt from the repository, fetched Nov 12, 2026.
Read the project’s introduction
mal - Make a Lisp
Description
1. Mal is a Clojure inspired Lisp interpreter
2. Mal is a learning tool
Each implementation of mal is separated into
11 incremental, self-contained (and testable) steps that demonstrate
core concepts of Lisp. The last step is capable of self-hosting
(running the mal implementation of mal). See the make-a-lisp process
guide.
The make-a-lisp steps are:
step0_repl
step1_read_print
step2_eval
step3_env
step4_if_fn_do
step5_tco
step6_file
step7_quote
step8_macros
step9_try
stepA_mal
Each make-a-lisp step has an associated architectural diagram. That elements
that are new for that step are highlighted in red.
Here is the final architecture once step A
is complete:
If you are interested in creating a mal implementation (or just
interested in using mal for something) you are welcome to to join our
Discord. In addition to the make-a-lisp
process guide there is also a mal/make-a-lisp
FAQ where I attempt to answer some common questions.
3. Mal is implemented in 89 languages (95 different implementations and 118 runtime modes)
Language
Creator
Ada
Chris Moore
Ada #2
Nicolas Boulenguez
GNU Awk
Mitsuru Kariya
Bash 4
Joel Martin
BASIC (C64 & QBasic)
Joel Martin
BBC BASIC V
Ben Harris
C
Joel Martin
C #2
Duncan Watts
C++
Stephen Thirlwall
C#
Joel Martin
ChucK
Vasilij Schneidermann
Clojure (Clojure & ClojureScript)
Joel Martin
CoffeeScript
Joel Martin
Common Lisp
Iqbal Ansari
Crystal
Linda_pp
D
Dov Murik
Dart
Harry Terkelsen
Elixir
Martin Ek
Elm
Jos van Bakel
Emacs Lisp
Vasilij Schneidermann
Erlang
Nathan Fiedler
ES6 (ECMAScript 2015)
Joel Martin
F#
Peter Stephens
Factor
Jordan Lewis
Fantom
Dov Murik
Fennel
sogaiu
Forth
Chris Houser
GNU Guile
Mu Lei
GNU Smalltalk
Vasilij Schneidermann
Go
Joel Martin
Groovy
Joel Martin
Hare
Lou Woell
Haskell
Joel Martin
Haxe (Neko, Python, C++, & JS)
Joel Martin
Hy
Joel Martin
Io
Dov Murik
Janet
sogaiu
Java
Joel Martin
Java Truffle (Truffle/GraalVM)
Matt McGill
JavaScript (Demo)
Joel Martin
jq
Ali MohammadPur
Julia
Joel Martin
Kotlin
Javier Fernandez-Ivern
LaTeX3
Nicolas Boulenguez
LiveScript
Jos van Bakel
Logo
Dov Murik
Lua
Joel Martin
GNU Make
Joel Martin
mal itself
Joel Martin
MATLAB (GNU Octave & MATLAB)
Joel Martin
miniMAL (Repo, Demo)
Joel Martin
NASM
Ben Dudson
Nim
Dennis Felsing
Object Pascal
Joel Martin
Objective C
Joel Martin
OCaml
Chris Houser
Perl
Joel Martin
Perl 6
Hinrik Örn Sigurðsson
PHP
Joel Martin
Picolisp
Vasilij Schneidermann
Pike
Dov Murik
PL/pgSQL (PostgreSQL)
Joel Martin
PL/SQL (Oracle)
Joel Martin
PostScript
Joel Martin
PowerShell
Joel Martin
Prolog
Nicolas Boulenguez
PureScript
mrsekut
Python2
Joel Martin
Python3
Gavin Lewis
RPython
Joel Martin
R
Joel Martin
Racket
Joel Martin
Rexx
Dov Murik
Ruby
Joel Martin
Ruby #2
Ryan Cook
Rust
Joel Martin
Scala
Joel Martin
Scheme (R7RS)
Vasilij Schneidermann
Skew
Dov Murik
Standard ML
Fabian Bergström
Swift 3
Joel Martin
Swift 4
陆遥
Swift 6
Oleg Montak
Tcl
Dov Murik
TypeScript
Masahiro Wakame
Vala
Simon Tatham
VHDL
Dov Murik
Vimscript
Dov Murik
Visual Basic.NET
Joel Martin
Visual Basic Script
刘百超
WebAssembly (wasm)
Joel Martin
Wren
Dov Murik
XSLT
Ali MohammadPur
Yorick
Dov Murik
Zig
Josh Tobin
Presentations
Mal was presented publicly for the first time in a lightning talk at
Clojure West 2014 (unfortunately there is no video). See
examples/clojurewest2014.mal for the presentation that was given at the
conference (yes, the presentation is a mal program).
At Midwest.io 2015, Joel Martin gave a presentation on Mal titled
"Achievement Unlocked: A Better Path to Language Learning".
Video,
Slides.
More recently Joel gave a presentation on "Make Your Own Lisp Interpreter
in 10 Incremental Steps" at LambdaConf 2016:
Part 1,
Part 2,
Part 3,
Part 4,
Slides.
Building/running implementations
The simplest way to run any given implementation is to use docker.
Every implementation has a docker image pre-built with language
dependencies installed. You can launch the REPL using a convenient
target in the top level Makefile (where IMPL is the implementation
directory name and stepX is the step to run):
make DOCKERIZE=1 "repl^IMPL^stepX"
# OR stepA is the default step:
make DOCKERIZE=1 "repl^IMPL"
External / Alternate Implementations
The following implementations are maintained as separate projects:
HolyC
by Alexander Bagnalla
Rust
by Tim Morgan
by vi - using Pest grammar, not using typical Mal infrastructure (cargo-ized steps and built-in converted tests).
Swift 2
by Keith Rollin - This implementation used to be in the repo. However, Swift 2 is no longer easily buildable/testable.
Q
by Ali Mohammad Pur - The Q implementation works fine but it requires a proprietary manual download that can't be Dockerized (or integrated into the mal CI pipeline) so for now it remains a separate project.
Other mal Projects
malc - Mal (Make A Lisp) compiler. Compiles a Mal program to LLVM assembly language, then binary.
malcc - malcc is an incremental compiler implementation for the Mal language. It uses the Tiny C Compiler as the compiler backend and has full support for the Mal language, including macros, tail-call elimination, and even run-time eval. "I Built a Lisp Compiler" post about the process.
frock - Clojure-flavoured PHP. Uses mal/php to run programs.
flk - A LISP that runs wherever Bash is
glisp - Self-bootstrapping graphic design tool on Lisp. Live Demo
mal2py-compiler - MAL-to-Python. A fork of the python3 implementation that compiles mal to python with a 16x performance improvement on the perf3 synthetic benchmark.
Implementation Details
Ada
The Ada implementation was developed with GNAT 4.9 on debian. It also
compiles unchanged on windows if you have windows versions of git,
GNAT and (optionally) make. There are no external dependencies
(readline not implemented).
cd impls/ada
make
./stepX
Read the full README on GitHub