{"id":13392734,"url":"https://github.com/kanaka/mal","last_synced_at":"2025-05-14T22:05:09.050Z","repository":{"id":15348900,"uuid":"18079664","full_name":"kanaka/mal","owner":"kanaka","description":"mal - Make a Lisp","archived":false,"fork":false,"pushed_at":"2025-05-05T23:52:44.000Z","size":12980,"stargazers_count":10271,"open_issues_count":36,"forks_count":2605,"subscribers_count":186,"default_branch":"master","last_synced_at":"2025-05-07T21:14:39.752Z","etag":null,"topics":["bash","c","c-plus-plus","c-sharp","clojure","docker","java","javascript","learn-to-code","lisp","lisp-interpreter","makefile","mal","php","python","r","ruby","scala","swift","webassembly"],"latest_commit_sha":null,"homepage":"","language":"Assembly","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kanaka.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2014-03-24T21:33:23.000Z","updated_at":"2025-05-07T16:46:13.000Z","dependencies_parsed_at":"2023-02-15T18:01:10.808Z","dependency_job_id":"c0a85996-0985-4895-8262-b7fb436a6cef","html_url":"https://github.com/kanaka/mal","commit_stats":{"total_commits":3141,"total_committers":125,"mean_commits":25.128,"dds":0.7077363896848137,"last_synced_commit":"dcf8f4d7b9cf7b858850a04a0b835d6a9f4e7176"},"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kanaka%2Fmal","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kanaka%2Fmal/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kanaka%2Fmal/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kanaka%2Fmal/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kanaka","download_url":"https://codeload.github.com/kanaka/mal/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254235686,"owners_count":22036962,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bash","c","c-plus-plus","c-sharp","clojure","docker","java","javascript","learn-to-code","lisp","lisp-interpreter","makefile","mal","php","python","r","ruby","scala","swift","webassembly"],"created_at":"2024-07-30T17:00:36.262Z","updated_at":"2025-05-14T22:05:08.907Z","avatar_url":"https://github.com/kanaka.png","language":"Assembly","readme":"# mal - Make a Lisp\n\n[![Build and Test](https://github.com/kanaka/mal/actions/workflows/main.yml/badge.svg)](https://github.com/kanaka/mal/actions/workflows/main.yml)\n\n## Description\n\n**1. Mal is a Clojure inspired Lisp interpreter**\n\n**2. Mal is a learning tool**\n\nEach implementation of mal is separated into\n11 incremental, self-contained (and testable) steps that demonstrate\ncore concepts of Lisp. The last step is capable of self-hosting\n(running the mal implementation of mal). See the [make-a-lisp process\nguide](process/guide.md).\n\nThe make-a-lisp steps are:\n\n* [step0_repl](process/guide.md#step-0-the-repl)\n* [step1_read_print](process/guide.md#step-1-read-and-print)\n* [step2_eval](process/guide.md#step-2-eval)\n* [step3_env](process/guide.md#step-3-environments)\n* [step4_if_fn_do](process/guide.md#step-4-if-fn-do)\n* [step5_tco](process/guide.md#step-5-tail-call-optimization)\n* [step6_file](process/guide.md#step-6-files-mutation-and-evil)\n* [step7_quote](process/guide.md#step-7-quoting)\n* [step8_macros](process/guide.md#step-8-macros)\n* [step9_try](process/guide.md#step-9-try)\n* [stepA_mal](process/guide.md#step-a-metadata-self-hosting-and-interop)\n\nEach make-a-lisp step has an associated architectural diagram. That elements\nthat are new for that step are highlighted in red.\nHere is the final architecture once [step A](process/guide.md#stepA)\nis complete:\n\n![stepA_mal architecture](process/steps.png)\n\nIf you are interested in creating a mal implementation (or just\ninterested in using mal for something) you are welcome to to join our\n[Discord](https://discord.gg/CKgnNbJBpF). In addition to the [make-a-lisp\nprocess guide](process/guide.md) there is also a [mal/make-a-lisp\nFAQ](docs/FAQ.md) where I attempt to answer some common questions.\n\n\n**3. Mal is implemented in 89 languages (95 different implementations and 118 runtime modes)**\n\n| Language | Creator |\n| -------- | ------- |\n| [Ada](#ada) | [Chris Moore](https://github.com/zmower) |\n| [Ada #2](#ada2) | [Nicolas Boulenguez](https://github.com/asarhaddon) |\n| [GNU Awk](#gnu-awk) | [Mitsuru Kariya](https://github.com/kariya-mitsuru) |\n| [Bash 4](#bash-4) | [Joel Martin](https://github.com/kanaka)  |\n| [BASIC](#basic-c64-and-qbasic) (C64 \u0026amp; QBasic) | [Joel Martin](https://github.com/kanaka) |\n| [BBC BASIC V](#bbc-basic-v) | [Ben Harris](https://github.com/bjh21) |\n| [C](#c) | [Joel Martin](https://github.com/kanaka)  |\n| [C #2](#c2) | [Duncan Watts](https://github.com/fungiblecog)  |\n| [C++](#c-1) | [Stephen Thirlwall](https://github.com/sdt) |\n| [C#](#c-2) | [Joel Martin](https://github.com/kanaka)  |\n| [ChucK](#chuck) | [Vasilij Schneidermann](https://github.com/wasamasa) |\n| [Clojure](#clojure) (Clojure \u0026amp; ClojureScript) | [Joel Martin](https://github.com/kanaka) |\n| [CoffeeScript](#coffeescript) | [Joel Martin](https://github.com/kanaka)  |\n| [Common Lisp](#common-lisp) | [Iqbal Ansari](https://github.com/iqbalansari) |\n| [Crystal](#crystal) | [Linda_pp](https://github.com/rhysd) |\n| [D](#d) | [Dov Murik](https://github.com/dubek) |\n| [Dart](#dart) | [Harry Terkelsen](https://github.com/hterkelsen) |\n| [Elixir](#elixir) | [Martin Ek](https://github.com/ekmartin) |\n| [Elm](#elm) | [Jos van Bakel](https://github.com/c0deaddict) |\n| [Emacs Lisp](#emacs-lisp) | [Vasilij Schneidermann](https://github.com/wasamasa) |\n| [Erlang](#erlang) | [Nathan Fiedler](https://github.com/nlfiedler) |\n| [ES6](#es6-ecmascript-2015) (ECMAScript 2015) | [Joel Martin](https://github.com/kanaka) |\n| [F#](#f) | [Peter Stephens](https://github.com/pstephens) |\n| [Factor](#factor) | [Jordan Lewis](https://github.com/jordanlewis) |\n| [Fantom](#fantom) | [Dov Murik](https://github.com/dubek) |\n| [Fennel](#fennel) | [sogaiu](https://github.com/sogaiu) |\n| [Forth](#forth) | [Chris Houser](https://github.com/chouser) |\n| [GNU Guile](#gnu-guile-21) | [Mu Lei](https://github.com/NalaGinrut) |\n| [GNU Smalltalk](#gnu-smalltalk) | [Vasilij Schneidermann](https://github.com/wasamasa) |\n| [Go](#go) | [Joel Martin](https://github.com/kanaka)  |\n| [Groovy](#groovy) | [Joel Martin](https://github.com/kanaka)  |\n| [Hare](#hare) | [Lou Woell](http://github.com/einsiedlerspiel) |\n| [Haskell](#haskell) | [Joel Martin](https://github.com/kanaka)  |\n| [Haxe](#haxe-neko-python-c-and-javascript) (Neko, Python, C++, \u0026amp; JS) | [Joel Martin](https://github.com/kanaka) |\n| [Hy](#hy) | [Joel Martin](https://github.com/kanaka)  |\n| [Io](#io) | [Dov Murik](https://github.com/dubek) |\n| [Janet](#janet) | [sogaiu](https://github.com/sogaiu) |\n| [Java](#java-17) | [Joel Martin](https://github.com/kanaka)  |\n| [Java Truffle](#java-using-truffle-for-graalvm) (Truffle/GraalVM) | [Matt McGill](https://github.com/mmcgill) |\n| [JavaScript](#javascriptnode) ([Demo](http://kanaka.github.io/mal)) | [Joel Martin](https://github.com/kanaka) |\n| [jq](#jq) | [Ali MohammadPur](https://github.com/alimpfard) |\n| [Julia](#julia) | [Joel Martin](https://github.com/kanaka)  |\n| [Kotlin](#kotlin) | [Javier Fernandez-Ivern](https://github.com/ivern) |\n| [LaTeX3](#latex3) | [Nicolas Boulenguez](https://github.com/asarhaddon) |\n| [LiveScript](#livescript) | [Jos van Bakel](https://github.com/c0deaddict) |\n| [Logo](#logo) | [Dov Murik](https://github.com/dubek) |\n| [Lua](#lua) | [Joel Martin](https://github.com/kanaka)  |\n| [GNU Make](#gnu-make-381) | [Joel Martin](https://github.com/kanaka)  |\n| [mal itself](#mal) | [Joel Martin](https://github.com/kanaka)  |\n| [MATLAB](#matlab-gnu-octave-and-matlab) (GNU Octave \u0026amp; MATLAB) | [Joel Martin](https://github.com/kanaka) |\n| [miniMAL](#minimal) ([Repo](https://github.com/kanaka/miniMAL), [Demo](https://kanaka.github.io/miniMAL/)) | [Joel Martin](https://github.com/kanaka) |\n| [NASM](#nasm) | [Ben Dudson](https://github.com/bendudson) |\n| [Nim](#nim-104) | [Dennis Felsing](https://github.com/def-) |\n| [Object Pascal](#object-pascal) | [Joel Martin](https://github.com/kanaka)  |\n| [Objective C](#objective-c) | [Joel Martin](https://github.com/kanaka)  |\n| [OCaml](#ocaml-4010) | [Chris Houser](https://github.com/chouser) |\n| [Perl](#perl-5) | [Joel Martin](https://github.com/kanaka)  |\n| [Perl 6](#perl-6) | [Hinrik Örn Sigurðsson](https://github.com/hinrik) |\n| [PHP](#php-53) | [Joel Martin](https://github.com/kanaka)  |\n| [Picolisp](#picolisp) | [Vasilij Schneidermann](https://github.com/wasamasa) |\n| [Pike](#pike) | [Dov Murik](https://github.com/dubek) |\n| [PL/pgSQL](#plpgsql-postgresql-sql-procedural-language) (PostgreSQL) | [Joel Martin](https://github.com/kanaka) |\n| [PL/SQL](#plsql-oracle-sql-procedural-language) (Oracle) | [Joel Martin](https://github.com/kanaka) |\n| [PostScript](#postscript-level-23) | [Joel Martin](https://github.com/kanaka)  |\n| [PowerShell](#powershell) | [Joel Martin](https://github.com/kanaka)  |\n| [Prolog](#prolog-logical-language) | [Nicolas Boulenguez](https://github.com/asarhaddon) |\n| [PureScript](#purescript) | [mrsekut](https://github.com/mrsekut) |\n| [Python2](#python2) | [Joel Martin](https://github.com/kanaka) |\n| [Python3](#python3) | [Gavin Lewis](https://github.com/epylar) |\n| [RPython](#rpython) | [Joel Martin](https://github.com/kanaka)  |\n| [R](#r) | [Joel Martin](https://github.com/kanaka)  |\n| [Racket](#racket-53) | [Joel Martin](https://github.com/kanaka)  |\n| [Rexx](#rexx) | [Dov Murik](https://github.com/dubek) |\n| [Ruby](#ruby-19) | [Joel Martin](https://github.com/kanaka)  |\n| [Ruby #2](#ruby) | [Ryan Cook](https://github.com/cookrn)  |\n| [Rust](#rust-138) | [Joel Martin](https://github.com/kanaka)  |\n| [Scala](#scala) | [Joel Martin](https://github.com/kanaka)  |\n| [Scheme (R7RS)](#scheme-r7rs) | [Vasilij Schneidermann](https://github.com/wasamasa) |\n| [Skew](#skew) | [Dov Murik](https://github.com/dubek) |\n| [Standard ML](#sml) | [Fabian Bergström](https://github.com/fabjan) |\n| [Swift 3](#swift-3) | [Joel Martin](https://github.com/kanaka)  |\n| [Swift 4](#swift-4) | [陆遥](https://github.com/LispLY)  |\n| [Swift 6](#swift-6) | [Oleg Montak](https://github.com/MontakOleg)  |\n| [Tcl](#tcl-86) | [Dov Murik](https://github.com/dubek) |\n| [TypeScript](#typescript) | [Masahiro Wakame](https://github.com/vvakame) |\n| [Vala](#vala) | [Simon Tatham](https://github.com/sgtatham) |\n| [VHDL](#vhdl) | [Dov Murik](https://github.com/dubek) |\n| [Vimscript](#vimscript) | [Dov Murik](https://github.com/dubek) |\n| [Visual Basic.NET](#visual-basicnet) | [Joel Martin](https://github.com/kanaka)  |\n| [Visual Basic Script](#visual-basic-script) | [刘百超](https://github.com/OldLiu001)  |\n| [WebAssembly](#webassembly-wasm) (wasm) | [Joel Martin](https://github.com/kanaka) |\n| [Wren](#wren) | [Dov Murik](https://github.com/dubek) |\n| [XSLT](#xslt) | [Ali MohammadPur](https://github.com/alimpfard) |\n| [Yorick](#yorick) | [Dov Murik](https://github.com/dubek) |\n| [Zig](#zig) | [Josh Tobin](https://github.com/rjtobin) |\n\n\n## Presentations\n\nMal was presented publicly for the first time in a lightning talk at\nClojure West 2014 (unfortunately there is no video). See\nexamples/clojurewest2014.mal for the presentation that was given at the\nconference (yes, the presentation is a mal program).\n\nAt Midwest.io 2015, Joel Martin gave a presentation on Mal titled\n\"Achievement Unlocked: A Better Path to Language Learning\".\n[Video](https://www.youtube.com/watch?v=lgyOAiRtZGw),\n[Slides](http://kanaka.github.io/midwest.io.mal/).\n\nMore recently Joel gave a presentation on \"Make Your Own Lisp Interpreter\nin 10 Incremental Steps\" at LambdaConf 2016:\n[Part 1](https://www.youtube.com/watch?v=jVhupfthTEk),\n[Part 2](https://www.youtube.com/watch?v=X5OQBMGpaTU),\n[Part 3](https://www.youtube.com/watch?v=6mARZzGgX4U),\n[Part 4](https://www.youtube.com/watch?v=dCO1SYR5kDU),\n[Slides](http://kanaka.github.io/lambdaconf/).\n\n## Building/running implementations\n\nThe simplest way to run any given implementation is to use docker.\nEvery implementation has a docker image pre-built with language\ndependencies installed. You can launch the REPL using a convenient\ntarget in the top level Makefile (where IMPL is the implementation\ndirectory name and stepX is the step to run):\n\n```\nmake DOCKERIZE=1 \"repl^IMPL^stepX\"\n    # OR stepA is the default step:\nmake DOCKERIZE=1 \"repl^IMPL\"\n```\n\n## External / Alternate Implementations\n\nThe following implementations are maintained as separate projects:\n\n### HolyC\n\n* [by Alexander Bagnalla](https://github.com/bagnalla/holyc_mal)\n\n### Rust\n\n* [by Tim Morgan](https://github.com/seven1m/mal-rust)\n* [by vi](https://github.com/vi/mal-rust-vi) - using [Pest](https://pest.rs/) grammar, not using typical Mal infrastructure (cargo-ized steps and built-in converted tests).\n\n### Swift 2\n\n* [by Keith Rollin](https://github.com/kanaka/mal/tree/fbfe678/impls/swift) - This implementation used to be in the repo. However, Swift 2 is no longer easily buildable/testable.\n\n### Q\n\n* [by Ali Mohammad Pur](https://github.com/alimpfard/mal/tree/q/impls/q) - 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.\n\n\n## Other mal Projects\n\n * [malc](https://github.com/dubek/malc) - Mal (Make A Lisp) compiler. Compiles a Mal program to LLVM assembly language, then binary.\n * [malcc](https://github.com/seven1m/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\"](https://mpov.timmorgan.org/i-built-a-lisp-compiler/) post about the process.\n * [frock](https://github.com/chr15m/frock) - Clojure-flavoured PHP. Uses mal/php to run programs.\n * [flk](https://github.com/chr15m/flk) - A LISP that runs wherever Bash is\n * [glisp](https://github.com/baku89/glisp) - Self-bootstrapping graphic design tool on Lisp. [Live Demo](https://baku89.com/glisp/)\n * [mal2py-compiler](https://github.com/jcguu95/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.\n\n\n## Implementation Details\n\n### Ada\n\nThe Ada implementation was developed with GNAT 4.9 on debian. It also\ncompiles unchanged on windows if you have windows versions of git,\nGNAT and (optionally) make.  There are no external dependencies\n(readline not implemented).\n\n```\ncd impls/ada\nmake\n./stepX_YYY\n```\n\n### Ada.2\n\nThe second Ada implementation was developed with GNAT 8 and links with\nthe GNU readline library.\n\n```\ncd impls/ada\nmake\n./stepX_YYY\n```\n\n### GNU awk\n\nThe GNU awk implementation of mal has been tested with GNU awk 4.1.1.\n\n```\ncd impls/gawk\ngawk -O -f stepX_YYY.awk\n```\n\n### Bash 4\n\n```\ncd impls/bash\nbash stepX_YYY.sh\n```\n\n### BASIC (C64 and QBasic)\n\nThe BASIC implementation uses a preprocessor that can generate BASIC\ncode that is compatible with both C64 BASIC (CBM v2) or QBasic. The\nC64 mode has been tested with\n[cbmbasic](https://github.com/kanaka/cbmbasic) (the patched version is\ncurrently required to fix issues with line input) and the QBasic mode\nhas been tested with [FreeBASIC](freebasic.net).\n\nGenerate C64 code and run it using cbmbasic:\n\n```\ncd impls/basic\nmake MODE=cbm stepX_YYY.bas\nSTEP=stepX_YYY basic_MODE=cbm ./run\n```\n\nGenerate QBasic code, compile using FreeBASIC, and execute it:\n\n```\ncd impls/basic\nmake MODE=qbasic stepX_YYY.bas\nmake MODE=qbasic stepX_YYY\n./stepX_YYY\n```\n\nThanks to [Steven Syrek](https://github.com/sjsyrek) for the original\ninspiration for this implementation.\n\n### BBC BASIC V\n\nThe BBC BASIC V implementation can run in the Brandy interpreter:\n\n```\ncd impls/bbc-basic\nbrandy -quit stepX_YYY.bbc\n```\n\nOr in ARM BBC BASIC V under RISC OS 3 or later:\n\n```\n*Dir bbc-basic.riscos\n*Run setup\n*Run stepX_YYY\n```\n\n### C\n\nThe C implementation of mal requires the following libraries (lib and\nheader packages): glib, libffi6, libgc, and either the libedit or GNU readline\nlibrary.\n\n```\ncd impls/c\nmake\n./stepX_YYY\n```\n\n### C.2\n\nThe second C implementation of mal requires the following libraries (lib and\nheader packages): libedit, libgc, libdl, and libffi.\n\n```\ncd impls/c.2\nmake\n./stepX_YYY\n```\n\n\n### C++\n\nThe C++ implementation of mal requires g++-4.9 or clang++-3.5 and\na readline compatible library to build. See the `cpp/README.md` for\nmore details:\n\n```\ncd impls/cpp\nmake\n    # OR\nmake CXX=clang++-3.5\n./stepX_YYY\n```\n\n\n### C# ###\n\nThe C# implementation of mal has been tested on Linux using the Mono\nC# compiler (mcs) and the Mono runtime (version 2.10.8.1). Both are\nrequired to build and run the C# implementation.\n\n```\ncd impls/cs\nmake\nmono ./stepX_YYY.exe\n```\n\n### ChucK\n\nThe ChucK implementation has been tested with ChucK 1.3.5.2.\n\n```\ncd impls/chuck\n./run\n```\n\n### Clojure\n\nFor the most part the Clojure implementation requires Clojure 1.5,\nhowever, to pass all tests, Clojure 1.8.0-RC4 is required.\n\n```\ncd impls/clojure\nlein with-profile +stepX trampoline run\n```\n\n### CoffeeScript\n\n```\nsudo npm install -g coffee-script\ncd impls/coffee\ncoffee ./stepX_YYY\n```\n\n### Common Lisp\n\nThe implementation has been tested with SBCL, CCL, CMUCL, GNU CLISP, ECL and\nAllegro CL on Ubuntu 16.04 and Ubuntu 12.04, see\nthe [README](impls/common-lisp/README.org) for more details. Provided you have the\ndependencies mentioned installed, do the following to run the implementation\n\n```\ncd impls/common-lisp\nmake\n./run\n```\n\n### Crystal\n\nThe Crystal implementation of mal has been tested with Crystal 0.26.1.\n\n```\ncd impls/crystal\ncrystal run ./stepX_YYY.cr\n    # OR\nmake   # needed to run tests\n./stepX_YYY\n```\n\n### D\n\nThe D implementation of mal was tested with GDC 4.8.  It requires the GNU\nreadline library.\n\n```\ncd impls/d\nmake\n./stepX_YYY\n```\n\n### Dart\n\nThe Dart implementation has been tested with Dart 1.20.\n\n```\ncd impls/dart\ndart ./stepX_YYY\n```\n\n### Emacs Lisp\n\nThe Emacs Lisp implementation of mal has been tested with Emacs 24.3\nand 24.5.  While there is very basic readline editing (`\u003cbackspace\u003e`\nand `C-d` work, `C-c` cancels the process), it is recommended to use\n`rlwrap`.\n\n```\ncd impls/elisp\nemacs -Q --batch --load stepX_YYY.el\n# with full readline support\nrlwrap emacs -Q --batch --load stepX_YYY.el\n```\n\n### Elixir\n\nThe Elixir implementation of mal has been tested with Elixir 1.0.5.\n\n```\ncd impls/elixir\nmix stepX_YYY\n# Or with readline/line editing functionality:\niex -S mix stepX_YYY\n```\n\n### Elm\n\nThe Elm implementation of mal has been tested with Elm 0.18.0\n\n```\ncd impls/elm\nmake stepX_YYY.js\nSTEP=stepX_YYY ./run\n```\n\n### Erlang\n\nThe Erlang implementation of mal requires [Erlang/OTP R17](http://www.erlang.org/download.html)\nand [rebar](https://github.com/rebar/rebar) to build.\n\n```\ncd impls/erlang\nmake\n    # OR\nMAL_STEP=stepX_YYY rebar compile escriptize # build individual step\n./stepX_YYY\n```\n\n### ES6 (ECMAScript 2015)\n\nThe ES6 / ECMAScript 2015 implementation uses the\n[babel](https://babeljs.io) compiler to generate ES5 compatible\nJavaScript. The generated code has been tested with Node 0.12.4.\n\n```\ncd impls/es6\nmake\nnode build/stepX_YYY.js\n```\n\n\n### F# ###\n\nThe F# implementation of mal has been tested on Linux using the Mono\nF# compiler (fsharpc) and the Mono runtime (version 3.12.1). The mono C#\ncompiler (mcs) is also necessary to compile the readline dependency. All are\nrequired to build and run the F# implementation.\n\n```\ncd impls/fsharp\nmake\nmono ./stepX_YYY.exe\n```\n\n### Factor\n\nThe Factor implementation of mal has been tested with Factor 0.97\n([factorcode.org](http://factorcode.org)).\n\n```\ncd impls/factor\nFACTOR_ROOTS=. factor -run=stepX_YYY\n```\n\n### Fantom\n\nThe Fantom implementation of mal has been tested with Fantom 1.0.70.\n\n```\ncd impls/fantom\nmake lib/fan/stepX_YYY.pod\nSTEP=stepX_YYY ./run\n```\n\n### Fennel\n\nThe Fennel implementation of mal has been tested with Fennel version\n0.9.1 on Lua 5.4.\n\n```\ncd impls/fennel\nfennel ./stepX_YYY.fnl\n```\n\n### Forth\n\n```\ncd impls/forth\ngforth stepX_YYY.fs\n```\n\n### GNU Guile 2.1+\n\n```\ncd impls/guile\nguile -L ./ stepX_YYY.scm\n```\n\n### GNU Smalltalk\n\nThe Smalltalk implementation of mal has been tested with GNU Smalltalk 3.2.91.\n\n```\ncd impls/gnu-smalltalk\n./run\n```\n\n### Go\n\nThe Go implementation of mal requires that go is installed on on the\npath. The implementation has been tested with Go 1.3.1.\n\n```\ncd impls/go\nmake\n./stepX_YYY\n```\n\n\n### Groovy\n\nThe Groovy implementation of mal requires Groovy to run and has been\ntested with Groovy 1.8.6.\n\n```\ncd impls/groovy\nmake\ngroovy ./stepX_YYY.groovy\n```\n\n### Hare\n\nThe hare implementation was tested against Hare 0.24.2.\n\n```\ncd impls/hare\nmake\n./stepX_YYY\n```\n\n### Haskell\n\nThe Haskell implementation requires the ghc compiler version 7.10.1 or\nlater and also the Haskell parsec and readline (or editline) packages.\n\n```\ncd impls/haskell\nmake\n./stepX_YYY\n```\n\n### Haxe (Neko, Python, C++ and JavaScript)\n\nThe Haxe implementation of mal requires Haxe version 3.2 to compile.\nFour different Haxe targets are supported: Neko, Python, C++, and\nJavaScript.\n\n```\ncd impls/haxe\n# Neko\nmake all-neko\nneko ./stepX_YYY.n\n# Python\nmake all-python\npython3 ./stepX_YYY.py\n# C++\nmake all-cpp\n./cpp/stepX_YYY\n# JavaScript\nmake all-js\nnode ./stepX_YYY.js\n```\n\n### Hy\n\nThe Hy implementation of mal has been tested with Hy 0.13.0.\n\n```\ncd impls/hy\n./stepX_YYY.hy\n```\n\n### Io\n\nThe Io implementation of mal has been tested with Io version 20110905.\n\n```\ncd impls/io\nio ./stepX_YYY.io\n```\n\n### Janet\n\nThe Janet implementation of mal has been tested with Janet version 1.12.2.\n\n```\ncd impls/janet\njanet ./stepX_YYY.janet\n```\n\n### Java 1.7\n\nThe Java implementation of mal requires maven2 to build.\n\n```\ncd impls/java\nmvn compile\nmvn -quiet exec:java -Dexec.mainClass=mal.stepX_YYY\n    # OR\nmvn -quiet exec:java -Dexec.mainClass=mal.stepX_YYY -Dexec.args=\"CMDLINE_ARGS\"\n```\n\n### Java, using Truffle for GraalVM\n\nThis Java implementation will run on OpenJDK, but can run\nas much as 30x faster on GraalVM thanks to the Truffle framework.\nIt's been tested with OpenJDK 11, GraalVM CE 20.1.0, and\nGraalVM CE 21.1.0.\n\n```\ncd impls/java-truffle\n./gradlew build\nSTEP=stepX_YYY ./run\n```\n\n### JavaScript/Node\n\n```\ncd impls/js\nnpm install\nnode stepX_YYY.js\n```\n\n### Julia\n\nThe Julia implementation of mal requires Julia 0.4.\n\n```\ncd impls/julia\njulia stepX_YYY.jl\n```\n\n### jq\n\nTested against version 1.6, with a lot of cheating in the IO department\n\n```\ncd impls/jq\nSTEP=stepA_YYY ./run\n    # with Debug\nDEBUG=true STEP=stepA_YYY ./run\n```\n\n### Kotlin\n\nThe Kotlin implementation of mal has been tested with Kotlin 1.0.\n\n```\ncd impls/kotlin\nmake\njava -jar stepX_YYY.jar\n```\n\n### LaTeX3\n\nThe LaTeX3 implementation of mal has been tested with pdfTeX\n3.141592653-2.6-1.40.24.\n\nSelf hosting is too slow for any sensible timeout, and crashes in\nstep4, apparently because of hard-coded limitations.\n\nAnybody working on this should uncomment the two lines of (slow)\ndebugging options in the step file, and export DEBUG=1 (for more\noutput than tests accept).\n\n### LiveScript\n\nThe LiveScript implementation of mal has been tested with LiveScript 1.5.\n\n```\ncd impls/livescript\nmake\nnode_modules/.bin/lsc stepX_YYY.ls\n```\n\n### Logo\n\nThe Logo implementation of mal has been tested with UCBLogo 6.0.\n\n```\ncd impls/logo\nlogo stepX_YYY.lg\n```\n\n### Lua\n\nThe Lua implementation of mal has been tested with Lua 5.3.5 The\nimplementation requires luarocks to be installed.\n\n```\ncd impls/lua\nmake  # to build and link linenoise.so and rex_pcre.so\n./stepX_YYY.lua\n```\n\n### Mal\n\nRunning the mal implementation of mal involves running stepA of one of\nthe other implementations and passing the mal step to run as a command\nline argument.\n\n```\ncd impls/IMPL\nIMPL_STEPA_CMD ../mal/stepX_YYY.mal\n\n```\n\n### GNU Make 3.81\n\n```\ncd impls/make\nmake -f stepX_YYY.mk\n```\n\n### NASM\n\nThe NASM implementation of mal is written for x86-64 Linux, and has been tested\nwith Linux 3.16.0-4-amd64 and NASM version 2.11.05.\n\n```\ncd impls/nasm\nmake\n./stepX_YYY\n```\n\n### Nim 1.0.4\n\nThe Nim implementation of mal has been tested with Nim 1.0.4.\n\n```\ncd impls/nim\nmake\n  # OR\nnimble build\n./stepX_YYY\n```\n\n### Object Pascal\n\nThe Object Pascal implementation of mal has been built and tested on\nLinux using the Free Pascal compiler version 2.6.2 and 2.6.4.\n\n```\ncd impls/objpascal\nmake\n./stepX_YYY\n```\n\n### Objective C\n\nThe Objective C implementation of mal has been built and tested on\nLinux using clang/LLVM 3.6. It has also been built and tested on OS\nX using Xcode 7.\n\n```\ncd impls/objc\nmake\n./stepX_YYY\n```\n\n### OCaml 4.01.0\n\n```\ncd impls/ocaml\nmake\n./stepX_YYY\n```\n\n### MATLAB (GNU Octave and MATLAB)\n\nThe MatLab implementation has been tested with GNU Octave 4.2.1.\nIt has also been tested with MATLAB version R2014a on Linux. Note that\nMATLAB is a commercial product.\n\n```\ncd impls/matlab\n./stepX_YYY\noctave -q --no-gui --no-history --eval \"stepX_YYY();quit;\"\nmatlab -nodisplay -nosplash -nodesktop -nojvm -r \"stepX_YYY();quit;\"\n    # OR with command line arguments\noctave -q --no-gui --no-history --eval \"stepX_YYY('arg1','arg2');quit;\"\nmatlab -nodisplay -nosplash -nodesktop -nojvm -r \"stepX_YYY('arg1','arg2');quit;\"\n```\n\n### miniMAL\n\n[miniMAL](https://github.com/kanaka/miniMAL) is small Lisp interpreter\nimplemented in less than 1024 bytes of JavaScript. To run the miniMAL\nimplementation of mal you need to download/install the miniMAL\ninterpreter (which requires Node.js).\n```\ncd impls/miniMAL\n# Download miniMAL and dependencies\nnpm install\nexport PATH=`pwd`/node_modules/minimal-lisp/:$PATH\n# Now run mal implementation in miniMAL\nminiMAL ./stepX_YYY\n```\n\n### Perl 5\n\nThe Perl 5 implementation should work with perl 5.19.3 and later.\n\nFor readline line editing support, install Term::ReadLine::Perl or\nTerm::ReadLine::Gnu from CPAN.\n\n```\ncd impls/perl\nperl stepX_YYY.pl\n```\n\n### Perl 6\n\nThe Perl 6 implementation was tested on Rakudo Perl 6 2016.04.\n\n```\ncd impls/perl6\nperl6 stepX_YYY.pl\n```\n\n### PHP 5.3\n\nThe PHP implementation of mal requires the php command line interface\nto run.\n\n```\ncd impls/php\nphp stepX_YYY.php\n```\n\n### Picolisp\n\nThe Picolisp implementation requires libreadline and Picolisp 3.1.11\nor later.\n\n```\ncd impls/picolisp\n./run\n```\n\n### Pike\n\nThe Pike implementation was tested on Pike 8.0.\n\n```\ncd impls/pike\npike stepX_YYY.pike\n```\n\n### PL/pgSQL (PostgreSQL SQL Procedural Language)\n\nThe PL/pgSQL implementation of mal requires a running PostgreSQL server\n(the \"kanaka/mal-test-plpgsql\" docker image automatically starts\na PostgreSQL server). The implementation connects to the PostgreSQL server\nand create a database named \"mal\" to store tables and stored\nprocedures. The wrapper script uses the psql command to connect to the\nserver and defaults to the user \"postgres\" but this can be overridden\nwith the PSQL_USER environment variable. A password can be specified\nusing the PGPASSWORD environment variable. The implementation has been\ntested with PostgreSQL 9.4.\n\n```\ncd impls/plpgsql\n./wrap.sh stepX_YYY.sql\n    # OR\nPSQL_USER=myuser PGPASSWORD=mypass ./wrap.sh stepX_YYY.sql\n```\n\n### PL/SQL (Oracle SQL Procedural Language)\n\nThe PL/SQL implementation of mal requires a running Oracle DB\nserver (the \"kanaka/mal-test-plsql\" docker image automatically\nstarts an Oracle Express server). The implementation connects to the\nOracle server to create types, tables and stored procedures. The\ndefault SQL\\*Plus logon value (username/password@connect_identifier) is\n\"system/oracle\" but this can be overridden with the ORACLE_LOGON\nenvironment variable. The implementation has been tested with Oracle\nExpress Edition 11g Release 2. Note that any SQL\\*Plus connection\nwarnings (user password expiration, etc) will interfere with the\nability of the wrapper script to communicate with the DB.\n\n```\ncd impls/plsql\n./wrap.sh stepX_YYY.sql\n    # OR\nORACLE_LOGON=myuser/mypass@ORCL ./wrap.sh stepX_YYY.sql\n```\n\n### PostScript Level 2/3\n\nThe PostScript implementation of mal requires Ghostscript to run. It\nhas been tested with Ghostscript 9.10.\n\n```\ncd impls/ps\ngs -q -dNODISPLAY -I./ stepX_YYY.ps\n```\n\n### PowerShell\n\nThe PowerShell implementation of mal requires the PowerShell script\nlanguage. It has been tested with PowerShell 6.0.0 Alpha 9 on Linux.\n\n```\ncd impls/powershell\npowershell ./stepX_YYY.ps1\n```\n\n### Prolog\n\nThe Prolog implementation uses some constructs specific to SWI-Prolog,\nincludes readline support and has been tested on Debian GNU/Linux with\nversion 8.2.1.\n\n```\ncd impls/prolog\nswipl stepX_YYY\n```\n\n### PureScript\nThe PureScript implementation requires the spago compiler version 0.20.2.\n\n```\ncd impls/purs\nmake\nnode ./stepX_YYY.js\n```\n\n### Python2\n\nThis implementation only uses python2 features, but avoids\nincompatibilities with python3.\n\n### Python3\n\nThis implementation is checked for style and types\n(flake8, pylint, mypy).  It reports all errors with details.\nIt demonstrates iterators, decorators, functional tools, chain maps,\ndataclasses, introspection, match statements, assignement expressions.\n\n### RPython\n\nYou must have [rpython](https://rpython.readthedocs.org/) on your path\n(included with [pypy](https://bitbucket.org/pypy/pypy/)).\n\n```\ncd impls/rpython\nmake        # this takes a very long time\n./stepX_YYY\n```\n\n### R\n\nThe R implementation of mal requires R (r-base-core) to run.\n\n```\ncd impls/r\nmake libs  # to download and build rdyncall\nRscript stepX_YYY.r\n```\n\n### Racket (5.3)\n\nThe Racket implementation of mal requires the Racket\ncompiler/interpreter to run.\n\n```\ncd impls/racket\n./stepX_YYY.rkt\n```\n\n### Rexx\n\nThe Rexx implementation of mal has been tested with Regina Rexx 3.6.\n\n```\ncd impls/rexx\nmake\nrexx -a ./stepX_YYY.rexxpp\n```\n\n### Ruby (1.9+)\n\n```\ncd impls/ruby\nruby stepX_YYY.rb\n```\n\n### Ruby #2\n\nA second Ruby implementation with the following goals:\n\n- No global variables\n- No modification (monkey-patching) of core Ruby classes\n- Modularized into the `Mal` module namespace\n\n```\ncd impls/ruby.2\nruby stepX_YYY.rb\n```\n\n### Rust (1.38+)\n\nThe rust implementation of mal requires the rust compiler and build\ntool (cargo) to build.\n\n```\ncd impls/rust\ncargo run --release --bin stepX_YYY\n```\n\n### Scala ###\n\nInstall scala and sbt (http://www.scala-sbt.org/0.13/tutorial/Installing-sbt-on-Linux.html):\n\n```\ncd impls/scala\nsbt 'run-main stepX_YYY'\n    # OR\nsbt compile\nscala -classpath target/scala*/classes stepX_YYY\n```\n\n### Scheme (R7RS) ###\n\nThe Scheme implementation of MAL has been tested with Chibi-Scheme\n0.10, Kawa 3.1.1, Gauche 0.9.6, CHICKEN 5.1.0, Sagittarius 0.9.7,\nCyclone 0.32.0 (Git version) and Foment 0.4 (Git version).  You should\nbe able to get it running on other conforming R7RS implementations\nafter figuring out how libraries are loaded and adjusting the\n`Makefile` and `run` script accordingly.\n\n```\ncd impls/scheme\n# chibi\nscheme_MODE=chibi ./run\n# kawa\nmake kawa\nscheme_MODE=kawa ./run\n# gauche\nscheme_MODE=gauche ./run\n# chicken\nmake chicken\nscheme_MODE=chicken ./run\n# sagittarius\nscheme_MODE=sagittarius ./run\n# cyclone\nmake cyclone\nscheme_MODE=cyclone ./run\n# foment\nscheme_MODE=foment ./run\n```\n\n### Skew ###\n\nThe Skew implementation of mal has been tested with Skew 0.7.42.\n\n```\ncd impls/skew\nmake\nnode stepX_YYY.js\n```\n\n\n### Standard ML (Poly/ML, MLton, Moscow ML)\n\nThe Standard ML implementation of mal requires an\n[SML97](https://github.com/SMLFamily/The-Definition-of-Standard-ML-Revised)\nimplementation. The Makefile supports Poly/ML, MLton, Moscow ML, and has\nbeen tested with Poly/ML 5.8.1, MLton 20210117, and Moscow ML version 2.10.\n\n```\ncd impls/sml\n# Poly/ML\nmake sml_MODE=polyml\n./stepX_YYY\n# MLton\nmake sml_MODE=mlton\n./stepX_YYY\n# Moscow ML\nmake sml_MODE=mosml\n./stepX_YYY\n```\n\n\n### Swift 3\n\nThe Swift 3 implementation of mal requires the Swift 3.0 compiler. It\nhas been tested with Swift 3 Preview 3.\n\n```\ncd impls/swift3\nmake\n./stepX_YYY\n```\n\n### Swift 4\n\nThe Swift 4 implementation of mal requires the Swift 4.0 compiler. It\nhas been tested with Swift 4.2.3 release.\n\n```\ncd impls/swift4\nmake\n./stepX_YYY\n```\n\n### Swift 5\n\nThe Swift 5 implementation of mal requires the Swift 5.0 compiler. It\nhas been tested with Swift 5.1.1 release.\n\n```\ncd impls/swift6\nswift run stepX_YYY\n```\n\n### Tcl 8.6\n\nThe Tcl implementation of mal requires Tcl 8.6 to run.  For readline line\nediting support, install tclreadline.\n\n```\ncd impls/tcl\ntclsh ./stepX_YYY.tcl\n```\n\n### TypeScript\n\nThe TypeScript implementation of mal requires the TypeScript 2.2 compiler.\nIt has been tested with Node.js v6.\n\n```\ncd impls/ts\nmake\nnode ./stepX_YYY.js\n```\n\n### Vala\n\nThe Vala implementation of mal has been tested with the Vala 0.40.8\ncompiler. You will need to install `valac` and `libreadline-dev` or\nequivalent.\n\n```\ncd impls/vala\nmake\n./stepX_YYY\n```\n\n### VHDL\n\nThe VHDL implementation of mal has been tested with GHDL 0.29.\n\n```\ncd impls/vhdl\nmake\n./run_vhdl.sh ./stepX_YYY\n```\n\n### Vimscript\n\nThe Vimscript implementation of mal requires Vim 8.0 to run.\n\n```\ncd impls/vimscript\n./run_vimscript.sh ./stepX_YYY.vim\n```\n\n### Visual Basic.NET ###\n\nThe VB.NET implementation of mal has been tested on Linux using the Mono\nVB compiler (vbnc) and the Mono runtime (version 2.10.8.1). Both are\nrequired to build and run the VB.NET implementation.\n\n```\ncd impls/vb\nmake\nmono ./stepX_YYY.exe\n```\n\n### Visual Basic Script ###\n\nThe VBScript implementation of mal has been tested on Windows 10 1909.\n`install.vbs` can help you install the requirements (.NET 2.0 3.0 3.5).\nIf you havn't install `.NET 2.0 3.0 3.5`, it will popup a window for installation.\nIf you already installed that, it will do nothing.\n\n```\ncd impls\\vbs\ninstall.vbs\ncscript -nologo stepX_YYY.vbs\n```\n\n### WebAssembly (wasm) ###\n\nThe WebAssembly implementation is written in\n[Wam](https://github.com/kanaka/wam) (WebAssembly Macro language) and\nruns under several different non-web embeddings (runtimes):\n[node](https://nodejs.org),\n[wasmtime](https://github.com/CraneStation/wasmtime),\n[wasmer](https://wasmer.io),\n[wax](https://github.com/kanaka/wac),\n[wace](https://github.com/kanaka/wac),\n[warpy](https://github.com/kanaka/warpy).\n\n```\ncd impls/wasm\n# node\nmake wasm_MODE=node\n./run.js ./stepX_YYY.wasm\n# wasmtime\nmake wasm_MODE=wasmtime\nwasmtime --dir=./ --dir=../ --dir=/ ./stepX_YYY.wasm\n# wasmer\nmake wasm_MODE=wasmer\nwasmer run --dir=./ --dir=../ --dir=/ ./stepX_YYY.wasm\n# wax\nmake wasm_MODE=wax\nwax ./stepX_YYY.wasm\n# wace\nmake wasm_MODE=wace_libc\nwace ./stepX_YYY.wasm\n# warpy\nmake wasm_MODE=warpy\nwarpy --argv --memory-pages 256 ./stepX_YYY.wasm\n```\n\n### XSLT\n\nThe XSLT implementation of mal is written with XSLT 3 and tested on Saxon 9.9.1.6 Home Edition.\n\n```\ncd impls/xslt\nSTEP=stepX_YY ./run\n```\n\n### Wren\n\nThe Wren implementation of mal was tested on Wren 0.2.0.\n\n```\ncd impls/wren\nwren ./stepX_YYY.wren\n```\n\n### Yorick\n\nThe Yorick implementation of mal was tested on Yorick 2.2.04.\n\n```\ncd impls/yorick\nyorick -batch ./stepX_YYY.i\n```\n\n### Zig\n\nThe Zig implementation of mal was tested on Zig 0.5.\n\n```\ncd impls/zig\nzig build stepX_YYY\n```\n\n\n\n## Running tests\n\nThe top level Makefile has a number of useful targets to assist with\nimplementation development and testing. The `help` target provides\na list of the targets and options:\n\n```\nmake help\n```\n\n### Functional tests\n\nThe are almost 800 generic functional tests (for all implementations)\nin the `tests/` directory. Each step has a corresponding test file\ncontaining tests specific to that step. The `runtest.py` test harness\nlaunches a Mal step implementation and then feeds the tests one at\na time to the implementation and compares the output/return value to\nthe expected output/return value.\n\n* To run all the tests across all implementations (be prepared to wait):\n\n```\nmake test\n```\n\n* To run all tests against a single implementation:\n\n```\nmake \"test^IMPL\"\n\n# e.g.\nmake \"test^clojure\"\nmake \"test^js\"\n```\n\n* To run tests for a single step against all implementations:\n\n```\nmake \"test^stepX\"\n\n# e.g.\nmake \"test^step2\"\nmake \"test^step7\"\n```\n\n* To run tests for a specific step against a single implementation:\n\n```\nmake \"test^IMPL^stepX\"\n\n# e.g\nmake \"test^ruby^step3\"\nmake \"test^ps^step4\"\n```\n\n### Self-hosted functional tests\n\n* To run the functional tests in self-hosted mode, you specify `mal`\n  as the test implementation and use the `MAL_IMPL` make variable\n  to change the underlying host language (default is JavaScript):\n```\nmake MAL_IMPL=IMPL \"test^mal^step2\"\n\n# e.g.\nmake \"test^mal^step2\"   # js is default\nmake MAL_IMPL=ruby \"test^mal^step2\"\nmake MAL_IMPL=python3 \"test^mal^step2\"\n```\n\n### Starting the REPL\n\n* To start the REPL of an implementation in a specific step:\n\n```\nmake \"repl^IMPL^stepX\"\n\n# e.g\nmake \"repl^ruby^step3\"\nmake \"repl^ps^step4\"\n```\n\n* If you omit the step, then `stepA` is used:\n\n```\nmake \"repl^IMPL\"\n\n# e.g\nmake \"repl^ruby\"\nmake \"repl^ps\"\n```\n\n* To start the REPL of the self-hosted implementation, specify `mal` as the\n  REPL implementation and use the `MAL_IMPL` make variable to change the\n  underlying host language (default is JavaScript):\n```\nmake MAL_IMPL=IMPL \"repl^mal^stepX\"\n\n# e.g.\nmake \"repl^mal^step2\"   # js is default\nmake MAL_IMPL=ruby \"repl^mal^step2\"\nmake MAL_IMPL=python3 \"repl^mal\"\n```\n\n### Performance tests\n\nWarning: These performance tests are neither statistically valid nor\ncomprehensive; runtime performance is a not a primary goal of mal. If\nyou draw any serious conclusions from these performance tests, then\nplease contact me about some amazing oceanfront property in Kansas\nthat I'm willing to sell you for cheap.\n\n* To run performance tests against a single implementation:\n```\nmake \"perf^IMPL\"\n\n# e.g.\nmake \"perf^js\"\n```\n\n* To run performance tests against all implementations:\n```\nmake \"perf\"\n```\n\n### Generating language statistics\n\n* To report line and byte statistics for a single implementation:\n```\nmake \"stats^IMPL\"\n\n# e.g.\nmake \"stats^js\"\n```\n\n## Dockerized testing\n\nEvery implementation directory contains a Dockerfile to create\na docker image containing all the dependencies for that\nimplementation. In addition, the top-level Makefile contains support\nfor running the tests target (and perf, stats, repl, etc) within\na docker container for that implementation by passing *\"DOCKERIZE=1\"*\non the make command line. For example:\n\n```\nmake DOCKERIZE=1 \"test^js^step3\"\n```\n\nExisting implementations already have docker images built and pushed\nto the docker registry. However, if\nyou wish to build or rebuild a docker image locally, the toplevel\nMakefile provides a rule for building docker images:\n\n```\nmake \"docker-build^IMPL\"\n```\n\n\n**Notes**:\n* Docker images are named *\"ghcr.io/kanaka/mal-test-IMPL\"*\n* JVM-based language implementations (Groovy, Java, Clojure, Scala):\n  you will probably need to run this command once manually\n  first `make DOCKERIZE=1 \"repl^IMPL\"` before you can run tests because\n  runtime dependencies need to be downloaded to avoid the tests timing\n  out. These dependencies are downloaded to dot-files in the /mal\n  directory so they will persist between runs.\n\n\n## License\n\nMal (make-a-lisp) is licensed under the MPL 2.0 (Mozilla Public\nLicense 2.0). See LICENSE.txt for more details.\n","funding_links":[],"categories":["Assembly","Swift","Interpreters: Lisp Based","Languages","[Assembly](#assembly)","Repository List","其他","Tutorials","swift","clojure","Compilers and Interpreters","**Programming (learning)**","Clojure-likes"],"sub_categories":["Multi Lang","网络服务_其他","Educational and Toy Projects","**Online education (others)**","[Apricot](https://github.com/apricot-lang/apricot)"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkanaka%2Fmal","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkanaka%2Fmal","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkanaka%2Fmal/lists"}