**1. Mal is a Clojure inspired Lisp interpreter**
-**2. Mal is implemented in 77 languages (78 different implementations and 99 runtime modes)**
+**2. Mal is implemented in 81 languages (84 different implementations and 104 runtime modes)**
| Language | Creator |
| -------- | ------- |
| [Io](#io) | [Dov Murik](https://github.com/dubek) |
| [Java](#java-17) | [Joel Martin](https://github.com/kanaka) |
| [JavaScript](#javascriptnode) ([Demo](http://kanaka.github.io/mal)) | [Joel Martin](https://github.com/kanaka) |
+| [jq](#jq) | [Ali MohammadPur](https://github.com/alimpfard) |
| [Julia](#julia) | [Joel Martin](https://github.com/kanaka) |
| [Kotlin](#kotlin) | [Javier Fernandez-Ivern](https://github.com/ivern) |
| [LiveScript](#livescript) | [Jos van Bakel](https://github.com/c0deaddict) |
| [MATLAB](#matlab-gnu-octave-and-matlab) (GNU Octave & MATLAB) | [Joel Martin](https://github.com/kanaka) |
| [miniMAL](#minimal) ([Repo](https://github.com/kanaka/miniMAL), [Demo](https://kanaka.github.io/miniMAL/)) | [Joel Martin](https://github.com/kanaka) |
| [NASM](#nasm) | [Ben Dudson](https://github.com/bendudson) |
-| [Nim](#nim-0170) | [Dennis Felsing](https://github.com/def-) |
+| [Nim](#nim-104) | [Dennis Felsing](https://github.com/def-) |
| [Object Pascal](#object-pascal) | [Joel Martin](https://github.com/kanaka) |
| [Objective C](#objective-c) | [Joel Martin](https://github.com/kanaka) |
| [OCaml](#ocaml-4010) | [Chris Houser](https://github.com/chouser) |
-| [Perl](#perl-58) | [Joel Martin](https://github.com/kanaka) |
+| [Perl](#perl-5) | [Joel Martin](https://github.com/kanaka) |
| [Perl 6](#perl-6) | [Hinrik Örn Sigurðsson](https://github.com/hinrik) |
| [PHP](#php-53) | [Joel Martin](https://github.com/kanaka) |
| [Picolisp](#picolisp) | [Vasilij Schneidermann](https://github.com/wasamasa) |
+| [Pike](#pike) | [Dov Murik](https://github.com/dubek) |
| [PL/pgSQL](#plpgsql-postgresql-sql-procedural-language) (PostgreSQL) | [Joel Martin](https://github.com/kanaka) |
| [PL/SQL](#plsql-oracle-sql-procedural-language) (Oracle) | [Joel Martin](https://github.com/kanaka) |
| [PostScript](#postscript-level-23) | [Joel Martin](https://github.com/kanaka) |
| [PowerShell](#powershell) | [Joel Martin](https://github.com/kanaka) |
| [Python](#python-2x-and-3x) (2.X & 3.X) | [Joel Martin](https://github.com/kanaka) |
+| [Python #2](#python2-3x) (3.X) | [Gavin Lewis](https://github.com/epylar) |
| [RPython](#rpython) | [Joel Martin](https://github.com/kanaka) |
| [R](#r) | [Joel Martin](https://github.com/kanaka) |
| [Racket](#racket-53) | [Joel Martin](https://github.com/kanaka) |
| [Rexx](#rexx) | [Dov Murik](https://github.com/dubek) |
| [Ruby](#ruby-19) | [Joel Martin](https://github.com/kanaka) |
-| [Rust](#rust-100-nightly) | [Joel Martin](https://github.com/kanaka) |
+| [Rust](#rust-138) | [Joel Martin](https://github.com/kanaka) |
| [Scala](#scala) | [Joel Martin](https://github.com/kanaka) |
| [Scheme (R7RS)](#scheme-r7rs) | [Vasilij Schneidermann](https://github.com/wasamasa) |
| [Skew](#skew) | [Dov Murik](https://github.com/dubek) |
| [Swift 2](#swift) | [Keith Rollin](https://github.com/keith-rollin) |
| [Swift 3](#swift-3) | [Joel Martin](https://github.com/kanaka) |
| [Swift 4](#swift-4) | [陆遥](https://github.com/LispLY) |
+| [Swift 5](#swift-5) | [Oleg Montak](https://github.com/MontakOleg) |
| [Tcl](#tcl-86) | [Dov Murik](https://github.com/dubek) |
| [TypeScript](#typescript) | [Masahiro Wakame](https://github.com/vvakame) |
| [Vala](#vala) | [Simon Tatham](https://github.com/sgtatham) |
| [Vimscript](#vimscript) | [Dov Murik](https://github.com/dubek) |
| [Visual Basic.NET](#visual-basicnet) | [Joel Martin](https://github.com/kanaka) |
| [WebAssembly](#webassembly-wasm) (wasm) | [Joel Martin](https://github.com/kanaka) |
+| [Wren](#wren) | [Dov Murik](https://github.com/dubek) |
| [Yorick](#yorick) | [Dov Murik](https://github.com/dubek) |
+| [Zig](#zig) | [Josh Tobin](https://github.com/rjtobin) |
**3. Mal is a learning tool**
## Other mal Projects
* [malc](https://github.com/dubek/malc) - Mal (Make A Lisp) compiler. Compiles a Mal program to LLVM assembly language, then binary.
- * [malcc](https://git.sr.ht/~tim/malcc) (@seven1m) - 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.
+ * [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.
* [frock](https://github.com/chr15m/frock) - Clojure-flavoured PHP. Uses mal/php to run programs.
+ * [flk](https://github.com/chr15m/flk) - A LISP that runs wherever Bash is
## Implementation Details
```
cd js
-npm update
+npm install
node stepX_YYY.js
```
julia stepX_YYY.jl
```
+### jq
+
+Tested against version 1.6, with a lot of cheating in the IO department
+
+```
+cd jq
+STEP=stepA_YYY ./run
+ # with Debug
+DEBUG=true STEP=stepA_YYY ./run
+```
+
### Kotlin
The Kotlin implementation of mal has been tested with Kotlin 1.0.
./stepX_YYY
```
-### Nim 0.17.0
+### Nim 1.0.4
-The Nim implementation of mal has been tested with Nim 0.17.0.
+The Nim implementation of mal has been tested with Nim 1.0.4.
```
cd nim
miniMAL ./stepX_YYY
```
-### Perl 5.8
+### Perl 5
+
+The Perl 5 implementation should work with perl 5.19.3 and later.
For readline line editing support, install Term::ReadLine::Perl or
Term::ReadLine::Gnu from CPAN.
./run
```
+### Pike
+
+The Pike implementation was tested on Pike 8.0.
+
+```
+cd pike
+pike stepX_YYY.pike
+```
+
### PL/pgSQL (PostgreSQL SQL Procedural Language)
The PL/pgSQL implementation of mal requires a running PostgreSQL server
python stepX_YYY.py
```
+### Python.2 (3.X)
+
+The second Python implementation makes heavy use of type annotations and uses the Arpeggio parser library.
+
+```
+# Recommended: do these steps in a Python virtual environment.
+pip3 install Arpeggio==1.9.0
+python3 stepX_YYY.py
+```
+
### RPython
You must have [rpython](https://rpython.readthedocs.org/) on your path
ruby stepX_YYY.rb
```
-### Rust (1.0.0 nightly)
+### Rust (1.38+)
The rust implementation of mal requires the rust compiler and build
tool (cargo) to build.
./stepX_YYY
```
+### Swift 5
+
+The Swift 5 implementation of mal requires the Swift 5.0 compiler. It
+has been tested with Swift 5.1.1 release.
+
+```
+cd swift5
+swift run stepX_YYY
+```
+
### Tcl 8.6
The Tcl implementation of mal requires Tcl 8.6 to run. For readline line
The WebAssembly implementation is written in
[Wam](https://github.com/kanaka/wam) (WebAssembly Macro language) and
runs under several different non-web embeddings (runtimes):
-node,
+[node](https://nodejs.org),
[wasmtime](https://github.com/CraneStation/wasmtime),
+[wasmer](https://wasmer.io),
+[lucet](https://github.com/fastly/lucet),
[wax](https://github.com/kanaka/wac),
[wace](https://github.com/kanaka/wac),
[warpy](https://github.com/kanaka/warpy).
# wasmtime
make wasm_MODE=wasmtime
wasmtime --dir=./ --dir=../ --dir=/ ./stepX_YYY.wasm
+# wasmer
+make wasm_MODE=wasmer
+wasmer run --dir=./ --dir=../ --dir=/ ./stepX_YYY.wasm
+# lucet
+make wasm_MODE=lucet
+lucet-wasi --dir=./:./ --dir=../:../ --dir=/:/ ./stepX_YYY.so
# wax
make wasm_MODE=wax
-wace ./stepX_YYY.wasm
+wax ./stepX_YYY.wasm
# wace
make wasm_MODE=wace_libc
wace ./stepX_YYY.wasm
warpy --argv --memory-pages 256 ./stepX_YYY.wasm
```
+### Wren
+
+The Wren implementation of mal was tested on Wren 0.2.0.
+
+```
+cd wren
+wren ./stepX_YYY.wren
+```
+
### Yorick
The Yorick implementation of mal was tested on Yorick 2.2.04.
yorick -batch ./stepX_YYY.i
```
+### Zig
+
+The Zig implementation of mal was tested on Zig 0.5.
+
+```
+cd zig
+zig build stepX_YYY
+```
+
## Running tests
### Functional tests
-The are over 600 generic functional tests (for all implementations)
+The are almost 800 generic functional tests (for all implementations)
in the `tests/` directory. Each step has a corresponding test file
containing tests specific to that step. The `runtest.py` test harness
launches a Mal step implementation and then feeds the tests one at