A Clojure-inspired Lisp interpreter implemented in 89+ languages as an incremental learning tool.
Mal (Make a Lisp) is a Clojure-inspired Lisp interpreter designed as a learning tool for understanding language implementation. It provides a structured, step-by-step guide to building a Lisp interpreter from scratch, covering core concepts like evaluation, environments, macros, and self-hosting. The project includes implementations in over 89 languages, serving as both a reference and a hands-on educational resource.
Developers, students, and language enthusiasts interested in learning how interpreters work, understanding Lisp semantics, or exploring language implementation across multiple programming languages.
Mal offers a unique, incremental approach to learning interpreter design with extensive multi-language examples and self-hosting capability, making it a comprehensive resource for both theoretical understanding and practical implementation.
mal - Make a Lisp
Open-Awesome is built by the community, for the community. Submit a project, suggest an awesome list, or help improve the catalog on GitHub.
Breaks down interpreter construction into 11 self-contained steps, from basic REPL to self-hosting, making complex concepts like macros and tail-call optimization accessible through structured, test-driven exercises.
Offers over 95 implementations across 89+ languages, from mainstream ones like Python and Rust to esoteric ones like PostScript and VHDL, providing unique comparative insights into language implementation patterns.
Achieves meta-circular evaluation by allowing the interpreter to run itself in the final step, demonstrating interpreter completeness and deepening understanding of language bootstrapping.
Includes nearly 800 functional tests and performance benchmarks across all implementations, ensuring correctness and consistency while aiding learning through automated validation.
Provides pre-built Docker images for each implementation, simplifying dependency management and setup, which is crucial for niche languages with complex toolchains.
Focused on pedagogy, implementations lack optimizations, robust error handling, and features needed for real-world use, as admitted in the performance test warnings.
With contributions across many languages, some implementations may be outdated, poorly documented, or rely on complex manual setups, such as the separate Q implementation requiring proprietary downloads.
The Mal language is Clojure-inspired but lacks the libraries, tooling, and community support of established Lisps, making it unsuitable for projects beyond educational exploration.
Steps like tail-call optimization and macro implementation require advanced programming knowledge, which might overwhelm beginners without prior exposure to functional programming or compiler theory.