impl step2, remove interleaved calls in READ/EVAL/PRINT
[jackhill/mal.git] / README.md
CommitLineData
60154d24
JM
1# mal - Make a Lisp
2
f9e6bb80
JM
3[![Build Status](https://travis-ci.org/kanaka/mal.svg?branch=master)](https://travis-ci.org/kanaka/mal)
4
bcddc3e4
JM
5## Description
6
5b6498bc 7**1. Mal is a Clojure inspired Lisp interpreter**
b76aa73b 8
8a19f603
JM
9**2. Mal is a learning tool**
10
11Each implementation of mal is separated into
1211 incremental, self-contained (and testable) steps that demonstrate
13core concepts of Lisp. The last step is capable of self-hosting
14(running the mal implementation of mal). See the [make-a-lisp process
024e0b04 15guide](process/guide.md).
8a19f603
JM
16
17The make-a-lisp steps are:
18
19* [step0_repl](process/guide.md#step0)
20* [step1_read_print](process/guide.md#step1)
21* [step2_eval](process/guide.md#step2)
22* [step3_env](process/guide.md#step3)
23* [step4_if_fn_do](process/guide.md#step4)
24* [step5_tco](process/guide.md#step5)
25* [step6_file](process/guide.md#step6)
26* [step7_quote](process/guide.md#step7)
27* [step8_macros](process/guide.md#step8)
28* [step9_try](process/guide.md#step9)
29* [stepA_mal](process/guide.md#stepA)
30
31Each make-a-lisp step has an associated architectural diagram. That elements
32that are new for that step are highlighted in red.
33Here is the final diagram for [step A](process/guide.md#stepA):
34
35![stepA_mal architecture](process/stepA_mal.png)
36
37If you are interested in creating a mal implementation (or just
38interested in using mal for something), please drop by the #mal
39channel on freenode. In addition to the [make-a-lisp process
40guide](process/guide.md) there is also a [mal/make-a-lisp
41FAQ](docs/FAQ.md) where I attempt to answer some common questions.
42
43
44**3. Mal is implemented in 81 languages (84 different implementations and 104 runtime modes)**
bcddc3e4 45
c5cd05ae
JM
46| Language | Creator |
47| -------- | ------- |
48| [Ada](#ada) | [Chris Moore](https://github.com/zmower) |
6d9e1684 49| [Ada #2](#ada2) | [Nicolas Boulenguez](https://github.com/asarhaddon) |
833fc8cc 50| [GNU Awk](#gnu-awk) | [Miutsuru Kariya](https://github.com/kariya-mitsuru) |
c5cd05ae
JM
51| [Bash 4](#bash-4) | [Joel Martin](https://github.com/kanaka) |
52| [BASIC](#basic-c64-and-qbasic) (C64 & QBasic) | [Joel Martin](https://github.com/kanaka) |
45c103e6 53| [BBC BASIC V](#bbc-basic-v) | [Ben Harris](https://github.com/bjh21) |
c5cd05ae
JM
54| [C](#c) | [Joel Martin](https://github.com/kanaka) |
55| [C++](#c-1) | [Stephen Thirlwall](https://github.com/sdt) |
56| [C#](#c-2) | [Joel Martin](https://github.com/kanaka) |
57| [ChucK](#chuck) | [Vasilij Schneidermann](https://github.com/wasamasa) |
c5cd05ae
JM
58| [Clojure](#clojure) (Clojure & ClojureScript) | [Joel Martin](https://github.com/kanaka) |
59| [CoffeeScript](#coffeescript) | [Joel Martin](https://github.com/kanaka) |
833fc8cc 60| [Common Lisp](#common-lisp) | [Iqbal Ansari](https://github.com/iqbalansari) |
c5cd05ae
JM
61| [Crystal](#crystal) | [Linda_pp](https://github.com/rhysd) |
62| [D](#d) | [Dov Murik](https://github.com/dubek) |
63| [Dart](#dart) | [Harry Terkelsen](https://github.com/hterkelsen) |
64| [Elixir](#elixir) | [Martin Ek](https://github.com/ekmartin) |
65| [Elm](#elm) | [Jos van Bakel](https://github.com/c0deaddict) |
66| [Emacs Lisp](#emacs-lisp) | [Vasilij Schneidermann](https://github.com/wasamasa) |
67| [Erlang](#erlang) | [Nathan Fiedler](https://github.com/nlfiedler) |
68| [ES6](#es6-ecmascript-2015) (ECMAScript 2015) | [Joel Martin](https://github.com/kanaka) |
69| [F#](#f) | [Peter Stephens](https://github.com/pstephens) |
70| [Factor](#factor) | [Jordan Lewis](https://github.com/jordanlewis) |
71| [Fantom](#fantom) | [Dov Murik](https://github.com/dubek) |
72| [Forth](#forth) | [Chris Houser](https://github.com/chouser) |
c5cd05ae
JM
73| [GNU Guile](#gnu-guile-21) | [Mu Lei](https://github.com/NalaGinrut) |
74| [GNU Smalltalk](#gnu-smalltalk) | [Vasilij Schneidermann](https://github.com/wasamasa) |
833fc8cc
JM
75| [Go](#go) | [Joel Martin](https://github.com/kanaka) |
76| [Groovy](#groovy) | [Joel Martin](https://github.com/kanaka) |
c5cd05ae
JM
77| [Haskell](#haskell) | [Joel Martin](https://github.com/kanaka) |
78| [Haxe](#haxe-neko-python-c-and-javascript) (Neko, Python, C++, & JS) | [Joel Martin](https://github.com/kanaka) |
79| [Hy](#hy) | [Joel Martin](https://github.com/kanaka) |
80| [Io](#io) | [Dov Murik](https://github.com/dubek) |
81| [Java](#java-17) | [Joel Martin](https://github.com/kanaka) |
82| [JavaScript](#javascriptnode) ([Demo](http://kanaka.github.io/mal)) | [Joel Martin](https://github.com/kanaka) |
236b0a40 83| [jq](#jq) | [Ali MohammadPur](https://github.com/alimpfard) |
c5cd05ae
JM
84| [Julia](#julia) | [Joel Martin](https://github.com/kanaka) |
85| [Kotlin](#kotlin) | [Javier Fernandez-Ivern](https://github.com/ivern) |
86| [LiveScript](#livescript) | [Jos van Bakel](https://github.com/c0deaddict) |
87| [Logo](#logo) | [Dov Murik](https://github.com/dubek) |
88| [Lua](#lua) | [Joel Martin](https://github.com/kanaka) |
89| [GNU Make](#gnu-make-381) | [Joel Martin](https://github.com/kanaka) |
90| [mal itself](#mal) | [Joel Martin](https://github.com/kanaka) |
833fc8cc 91| [MATLAB](#matlab-gnu-octave-and-matlab) (GNU Octave & MATLAB) | [Joel Martin](https://github.com/kanaka) |
c5cd05ae
JM
92| [miniMAL](#minimal) ([Repo](https://github.com/kanaka/miniMAL), [Demo](https://kanaka.github.io/miniMAL/)) | [Joel Martin](https://github.com/kanaka) |
93| [NASM](#nasm) | [Ben Dudson](https://github.com/bendudson) |
41558f01 94| [Nim](#nim-104) | [Dennis Felsing](https://github.com/def-) |
c5cd05ae
JM
95| [Object Pascal](#object-pascal) | [Joel Martin](https://github.com/kanaka) |
96| [Objective C](#objective-c) | [Joel Martin](https://github.com/kanaka) |
97| [OCaml](#ocaml-4010) | [Chris Houser](https://github.com/chouser) |
23e3304b 98| [Perl](#perl-5) | [Joel Martin](https://github.com/kanaka) |
c5cd05ae
JM
99| [Perl 6](#perl-6) | [Hinrik Örn Sigurðsson](https://github.com/hinrik) |
100| [PHP](#php-53) | [Joel Martin](https://github.com/kanaka) |
101| [Picolisp](#picolisp) | [Vasilij Schneidermann](https://github.com/wasamasa) |
742af2bb 102| [Pike](#pike) | [Dov Murik](https://github.com/dubek) |
33102dd1 103| [PL/pgSQL](#plpgsql-postgresql-sql-procedural-language) (PostgreSQL) | [Joel Martin](https://github.com/kanaka) |
c5cd05ae 104| [PL/SQL](#plsql-oracle-sql-procedural-language) (Oracle) | [Joel Martin](https://github.com/kanaka) |
833fc8cc 105| [PostScript](#postscript-level-23) | [Joel Martin](https://github.com/kanaka) |
c5cd05ae
JM
106| [PowerShell](#powershell) | [Joel Martin](https://github.com/kanaka) |
107| [Python](#python-2x-and-3x) (2.X & 3.X) | [Joel Martin](https://github.com/kanaka) |
8501fcab 108| [Python #2](#python2-3x) (3.X) | [Gavin Lewis](https://github.com/epylar) |
c5cd05ae
JM
109| [RPython](#rpython) | [Joel Martin](https://github.com/kanaka) |
110| [R](#r) | [Joel Martin](https://github.com/kanaka) |
111| [Racket](#racket-53) | [Joel Martin](https://github.com/kanaka) |
112| [Rexx](#rexx) | [Dov Murik](https://github.com/dubek) |
113| [Ruby](#ruby-19) | [Joel Martin](https://github.com/kanaka) |
bcb7af31 114| [Rust](#rust-138) | [Joel Martin](https://github.com/kanaka) |
c5cd05ae
JM
115| [Scala](#scala) | [Joel Martin](https://github.com/kanaka) |
116| [Scheme (R7RS)](#scheme-r7rs) | [Vasilij Schneidermann](https://github.com/wasamasa) |
117| [Skew](#skew) | [Dov Murik](https://github.com/dubek) |
833fc8cc 118| [Swift 2](#swift) | [Keith Rollin](https://github.com/keith-rollin) |
c5cd05ae 119| [Swift 3](#swift-3) | [Joel Martin](https://github.com/kanaka) |
2c1c2660 120| [Swift 4](#swift-4) | [陆遥](https://github.com/LispLY) |
6aa9c258 121| [Swift 5](#swift-5) | [Oleg Montak](https://github.com/MontakOleg) |
c5cd05ae
JM
122| [Tcl](#tcl-86) | [Dov Murik](https://github.com/dubek) |
123| [TypeScript](#typescript) | [Masahiro Wakame](https://github.com/vvakame) |
213a3288 124| [Vala](#vala) | [Simon Tatham](https://github.com/sgtatham) |
c5cd05ae
JM
125| [VHDL](#vhdl) | [Dov Murik](https://github.com/dubek) |
126| [Vimscript](#vimscript) | [Dov Murik](https://github.com/dubek) |
127| [Visual Basic.NET](#visual-basicnet) | [Joel Martin](https://github.com/kanaka) |
128| [WebAssembly](#webassembly-wasm) (wasm) | [Joel Martin](https://github.com/kanaka) |
84eaa11c 129| [Wren](#wren) | [Dov Murik](https://github.com/dubek) |
c5cd05ae 130| [Yorick](#yorick) | [Dov Murik](https://github.com/dubek) |
97a8edea 131| [Zig](#zig) | [Josh Tobin](https://github.com/rjtobin) |
bcddc3e4
JM
132
133
5b6498bc 134## Presentations
bcddc3e4
JM
135
136Mal was presented publicly for the first time in a lightning talk at
137Clojure West 2014 (unfortunately there is no video). See
dede32ba 138examples/clojurewest2014.mal for the presentation that was given at the
5b6498bc
JM
139conference (yes, the presentation is a mal program).
140
141At Midwest.io 2015, Joel Martin gave a presentation on Mal titled
142"Achievement Unlocked: A Better Path to Language Learning".
dede32ba 143[Video](https://www.youtube.com/watch?v=lgyOAiRtZGw),
5b6498bc
JM
144[Slides](http://kanaka.github.io/midwest.io.mal/).
145
146More recently Joel gave a presentation on "Make Your Own Lisp Interpreter
147in 10 Incremental Steps" at LambdaConf 2016:
86633b33
JM
148[Part 1](https://www.youtube.com/watch?v=jVhupfthTEk),
149[Part 2](https://www.youtube.com/watch?v=X5OQBMGpaTU),
150[Part 3](https://www.youtube.com/watch?v=6mARZzGgX4U),
151[Part 4](https://www.youtube.com/watch?v=dCO1SYR5kDU),
9ed75afd 152[Slides](http://kanaka.github.io/lambdaconf/).
60154d24
JM
153
154## Building/running implementations
155
5b207de7
JM
156The simplest way to run any given implementation is to use docker.
157Every implementation has a docker image pre-built with language
70cefa38 158dependencies installed. You can launch the REPL using a convenient
5b207de7
JM
159target in the top level Makefile (where IMPL is the implementation
160directory name and stepX is the step to run):
161
162```
163make DOCKERIZE=1 "repl^IMPL^stepX"
164 # OR stepA is the default step:
165make DOCKERIZE=1 "repl^IMPL"
166```
167
d4dec75b
JM
168## External Implementations
169
170The following implementations are maintained as separate projects:
171
172### HolyC
173
174* [by Alexander Bagnalla](https://github.com/bagnalla/holyc_mal)
175
176### Rust
177
178* [by Tim Morgan](https://github.com/seven1m/mal-rust)
179* [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).
180
181
182## Other mal Projects
183
184 * [malc](https://github.com/dubek/malc) - Mal (Make A Lisp) compiler. Compiles a Mal program to LLVM assembly language, then binary.
343c6332 185 * [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.
d4dec75b 186 * [frock](https://github.com/chr15m/frock) - Clojure-flavoured PHP. Uses mal/php to run programs.
1bdee167 187 * [flk](https://github.com/chr15m/flk) - A LISP that runs wherever Bash is
d4dec75b
JM
188
189
190## Implementation Details
5b207de7 191
6faafa00
CM
192### Ada
193
7b458a65
JM
194The Ada implementation was developed with GNAT 4.9 on debian. It also
195compiles unchanged on windows if you have windows versions of git,
196GNAT and (optionally) make. There are no external dependencies
197(readline not implemented).
6faafa00
CM
198
199```
8a19f603 200cd impls/ada
6faafa00
CM
201make
202./stepX_YYY
203```
204
d387f26e
JM
205### Ada.2
206
207The second Ada implementation was developed with GNAT 8 and links with
208the GNU readline library.
209
210```
8a19f603 211cd impls/ada
d387f26e
JM
212make
213./stepX_YYY
214```
215
8c7587af
MK
216### GNU awk
217
218The GNU awk implementation of mal has been tested with GNU awk 4.1.1.
219
220```
8a19f603 221cd impls/gawk
8c7587af
MK
222gawk -O -f stepX_YYY.awk
223```
224
bcddc3e4 225### Bash 4
60154d24
JM
226
227```
8a19f603 228cd impls/bash
60154d24
JM
229bash stepX_YYY.sh
230```
231
2bcc46af 232### BASIC (C64 and QBasic)
1b245300 233
2bcc46af
JM
234The BASIC implementation uses a preprocessor that can generate BASIC
235code that is compatible with both C64 BASIC (CBM v2) and QBasic. The
1b245300
JM
236C64 mode has been tested with
237[cbmbasic](https://github.com/kanaka/cbmbasic) (the patched version is
238currently required to fix issues with line input) and the QBasic mode
239has been tested with [qb64](http://www.qb64.net/).
240
241Generate C64 code and run it using cbmbasic:
242
243```
8a19f603 244cd impls/basic
1b245300
JM
245make stepX_YYY.bas
246STEP=stepX_YYY ./run
247```
248
249Generate QBasic code and load it into qb64:
250
251```
8a19f603 252cd impls/basic
1b245300
JM
253make MODE=qbasic stepX_YYY.bas
254./qb64 stepX_YYY.bas
255```
256
257Thanks to [Steven Syrek](https://github.com/sjsyrek) for the original
258inspiration for this implementation.
259
45c103e6
BH
260### BBC BASIC V
261
262The BBC BASIC V implementation can run in the Brandy interpreter:
263
264```
8a19f603 265cd impls/bbc-basic
45c103e6
BH
266brandy -quit stepX_YYY.bbc
267```
268
269Or in ARM BBC BASIC V under RISC OS 3 or later:
270
271```
272*Dir bbc-basic.riscos
273*Run setup
274*Run stepX_YYY
275```
1b245300 276
bcddc3e4 277### C
60154d24 278
01c97316 279The C implementation of mal requires the following libraries (lib and
6b3ecaa7
DM
280header packages): glib, libffi6, libgc, and either the libedit or GNU readline
281library.
54c75382 282
60154d24 283```
8a19f603 284cd impls/c
60154d24
JM
285make
286./stepX_YYY
287```
288
73fc9366
JM
289### C++
290
291The C++ implementation of mal requires g++-4.9 or clang++-3.5 and
292a readline compatible library to build. See the `cpp/README.md` for
293more details:
294
295```
8a19f603 296cd impls/cpp
73fc9366
JM
297make
298 # OR
299make CXX=clang++-3.5
300./stepX_YYY
301```
302
303
9b1563a3 304### C# ###
edc3b064
JM
305
306The C# implementation of mal has been tested on Linux using the Mono
307C# compiler (mcs) and the Mono runtime (version 2.10.8.1). Both are
308required to build and run the C# implementation.
309
310```
8a19f603 311cd impls/cs
edc3b064 312make
ee7cd585 313mono ./stepX_YYY.exe
edc3b064
JM
314```
315
385a08eb
VS
316### ChucK
317
332611f5 318The ChucK implementation has been tested with ChucK 1.3.5.2.
385a08eb
VS
319
320```
8a19f603 321cd impls/chuck
385a08eb
VS
322./run
323```
edc3b064 324
bcddc3e4 325### Clojure
60154d24 326
aa716df6
JM
327For the most part the Clojure implementation requires Clojure 1.5,
328however, to pass all tests, Clojure 1.8.0-RC4 is required.
329
60154d24 330```
8a19f603 331cd impls/clojure
60154d24
JM
332lein with-profile +stepX trampoline run
333```
334
891c3f3b
JM
335### CoffeeScript
336
337```
338sudo npm install -g coffee-script
8a19f603 339cd impls/coffee
891c3f3b
JM
340coffee ./stepX_YYY
341```
342
833fc8cc
JM
343### Common Lisp
344
345The implementation has been tested with SBCL, CCL, CMUCL, GNU CLISP, ECL and
346Allegro CL on Ubuntu 16.04 and Ubuntu 12.04, see
347the [README](common-lisp/README.org) for more details. Provided you have the
348dependencies mentioned installed, do the following to run the implementation
349
350```
8a19f603 351cd impls/common-lisp
833fc8cc
JM
352make
353./run
354```
355
58b84dd5 356### Crystal
357
5185c56e 358The Crystal implementation of mal has been tested with Crystal 0.26.1.
6c4dede1 359
58b84dd5 360```
8a19f603 361cd impls/crystal
58b84dd5 362crystal run ./stepX_YYY.cr
6c4dede1
JM
363 # OR
364make # needed to run tests
365./stepX_YYY
58b84dd5 366```
367
f82cb965
DM
368### D
369
f82cb965
DM
370The D implementation of mal was tested with GDC 4.8. It requires the GNU
371readline library.
372
373```
8a19f603 374cd impls/d
f82cb965
DM
375make
376./stepX_YYY
377```
378
bcf95720
HT
379### Dart
380
bcf95720
HT
381The Dart implementation has been tested with Dart 1.20.
382
383```
8a19f603 384cd impls/dart
bcf95720
HT
385dart ./stepX_YYY
386```
387
e0b7f668
VS
388### Emacs Lisp
389
e0b7f668
VS
390The Emacs Lisp implementation of mal has been tested with Emacs 24.3
391and 24.5. While there is very basic readline editing (`<backspace>`
392and `C-d` work, `C-c` cancels the process), it is recommended to use
393`rlwrap`.
394
395```
8a19f603 396cd impls/elisp
e0b7f668
VS
397emacs -Q --batch --load stepX_YYY.el
398# with full readline support
399rlwrap emacs -Q --batch --load stepX_YYY.el
400```
401
bb526975 402### Elixir
403
bb526975 404The Elixir implementation of mal has been tested with Elixir 1.0.5.
405
406```
8a19f603 407cd impls/elixir
df2ca97b 408mix stepX_YYY
409# Or with readline/line editing functionality:
bb526975 410iex -S mix stepX_YYY
411```
412
f38c7ffa
JB
413### Elm
414
f38c7ffa
JB
415The Elm implementation of mal has been tested with Elm 0.18.0
416
417```
8a19f603 418cd impls/elm
f38c7ffa
JB
419make stepX_YYY.js
420STEP=stepX_YYY ./run
421```
422
2cc3804b
NF
423### Erlang
424
82484631
JM
425The Erlang implementation of mal requires [Erlang/OTP R17](http://www.erlang.org/download.html)
426and [rebar](https://github.com/rebar/rebar) to build.
2cc3804b
NF
427
428```
8a19f603 429cd impls/erlang
425ef3d7
JM
430make
431 # OR
432MAL_STEP=stepX_YYY rebar compile escriptize # build individual step
2cc3804b
NF
433./stepX_YYY
434```
435
c5cd05ae 436### ES6 (ECMAScript 2015)
88e934b6 437
c5cd05ae
JM
438The ES6 / ECMAScript 2015 implementation uses the
439[babel](https://babeljs.io) compiler to generate ES5 compatible
440JavaScript. The generated code has been tested with Node 0.12.4.
88e934b6
JM
441
442```
8a19f603 443cd impls/es6
88e934b6
JM
444make
445node build/stepX_YYY.js
446```
447
448
6f78381f
PS
449### F# ###
450
6f78381f
PS
451The F# implementation of mal has been tested on Linux using the Mono
452F# compiler (fsharpc) and the Mono runtime (version 3.12.1). The mono C#
206a1657 453compiler (mcs) is also necessary to compile the readline dependency. All are
6f78381f
PS
454required to build and run the F# implementation.
455
456```
8a19f603 457cd impls/fsharp
6f78381f
PS
458make
459mono ./stepX_YYY.exe
460```
461
5a53c643
JL
462### Factor
463
0fe47e88 464The Factor implementation of mal has been tested with Factor 0.97
07eb827b 465([factorcode.org](http://factorcode.org)).
0fe47e88 466
5a53c643 467```
8a19f603 468cd impls/factor
199b1ce7 469FACTOR_ROOTS=. factor -run=stepX_YYY
5a53c643
JL
470```
471
92708e34
DM
472### Fantom
473
92708e34
DM
474The Fantom implementation of mal has been tested with Fantom 1.0.70.
475
476```
8a19f603 477cd impls/fantom
92708e34
DM
478make lib/fan/stepX_YYY.pod
479STEP=stepX_YYY ./run
480```
481
96032890
C
482### Forth
483
484```
8a19f603 485cd impls/forth
96032890
C
486gforth stepX_YYY.fs
487```
488
833fc8cc
JM
489### GNU Guile 2.1+
490
491```
8a19f603 492cd impls/guile
833fc8cc
JM
493guile -L ./ stepX_YYY.scm
494```
495
496### GNU Smalltalk
497
498The Smalltalk implementation of mal has been tested with GNU Smalltalk 3.2.91.
499
500```
8a19f603 501cd impls/gnu-smalltalk
833fc8cc
JM
502./run
503```
504
1771ab50
JM
505### Go
506
0fe47e88 507The Go implementation of mal requires that go is installed on on the
fd888612
JM
508path. The implementation has been tested with Go 1.3.1.
509
1771ab50 510```
8a19f603 511cd impls/go
1771ab50
JM
512make
513./stepX_YYY
514```
515
516
7ab0f63e
JM
517### Groovy
518
519The Groovy implementation of mal requires Groovy to run and has been
520tested with Groovy 1.8.6.
521
522```
8a19f603 523cd impls/groovy
7ab0f63e
JM
524make
525groovy ./stepX_YYY.groovy
526```
527
b76aa73b
JM
528### Haskell
529
f60f33e0
JM
530The Haskell implementation requires the ghc compiler version 7.10.1 or
531later and also the Haskell parsec and readline (or editline) packages.
b76aa73b
JM
532
533```
8a19f603 534cd impls/haskell
b76aa73b
JM
535make
536./stepX_YYY
537```
538
2d76e877 539### Haxe (Neko, Python, C++ and JavaScript)
33dec7af
JM
540
541The Haxe implementation of mal requires Haxe version 3.2 to compile.
542Four different Haxe targets are supported: Neko, Python, C++, and
543JavaScript.
544
545```
8a19f603 546cd impls/haxe
33dec7af
JM
547# Neko
548make all-neko
549neko ./stepX_YYY.n
550# Python
551make all-python
552python3 ./stepX_YYY.py
553# C++
554make all-cpp
555./cpp/stepX_YYY
556# JavaScript
557make all-js
558node ./stepX_YYY.js
559```
560
ccab8f59
JM
561### Hy
562
563The Hy implementation of mal has been tested with Hy 0.13.0.
564
565```
8a19f603 566cd impls/hy
ccab8f59
JM
567./stepX_YYY.hy
568```
569
61f69fba
DM
570### Io
571
61f69fba
DM
572The Io implementation of mal has been tested with Io version 20110905.
573
574```
8a19f603 575cd impls/io
61f69fba
DM
576io ./stepX_YYY.io
577```
b76aa73b 578
bcddc3e4 579### Java 1.7
60154d24 580
01c97316
JM
581The Java implementation of mal requires maven2 to build.
582
60154d24 583```
8a19f603 584cd impls/java
60154d24
JM
585mvn compile
586mvn -quiet exec:java -Dexec.mainClass=mal.stepX_YYY
587 # OR
588mvn -quiet exec:java -Dexec.mainClass=mal.stepX_YYY -Dexec.args="CMDLINE_ARGS"
589```
590
39381792 591### JavaScript/Node
60154d24
JM
592
593```
8a19f603 594cd impls/js
1b203ded 595npm install
60154d24
JM
596node stepX_YYY.js
597```
598
39381792
JM
599### Julia
600
82484631 601The Julia implementation of mal requires Julia 0.4.
39381792
JM
602
603```
8a19f603 604cd impls/julia
39381792
JM
605julia stepX_YYY.jl
606```
607
236b0a40 608### jq
0b25243b
A
609
610Tested against version 1.6, with a lot of cheating in the IO department
611
612```
8a19f603 613cd impls/jq
0b25243b
A
614STEP=stepA_YYY ./run
615 # with Debug
616DEBUG=true STEP=stepA_YYY ./run
617```
618
53c2ea70
JFI
619### Kotlin
620
75787d77 621The Kotlin implementation of mal has been tested with Kotlin 1.0.
53c2ea70
JFI
622
623```
8a19f603 624cd impls/kotlin
53c2ea70
JFI
625make
626java -jar stepX_YYY.jar
627```
628
0af8fd20
JB
629### LiveScript
630
0af8fd20
JB
631The LiveScript implementation of mal has been tested with LiveScript 1.5.
632
633```
8a19f603 634cd impls/livescript
0af8fd20
JB
635make
636node_modules/.bin/lsc stepX_YYY.ls
637```
638
4eb88ef2
DM
639### Logo
640
4eb88ef2
DM
641The Logo implementation of mal has been tested with UCBLogo 6.0.
642
643```
8a19f603 644cd impls/logo
4eb88ef2
DM
645logo stepX_YYY.lg
646```
647
9d42904e
JM
648### Lua
649
024e0b04
G
650The Lua implementation of mal has been tested with Lua 5.3.5 The
651implementation requires luarocks to be installed.
9d42904e
JM
652
653```
8a19f603 654cd impls/lua
024e0b04 655make # to build and link linenoise.so and rex_pcre.so
9d42904e
JM
656./stepX_YYY.lua
657```
658
bcddc3e4 659### Mal
60154d24
JM
660
661Running the mal implementation of mal involves running stepA of one of
662the other implementations and passing the mal step to run as a command
5d446bd8 663line argument.
60154d24
JM
664
665```
8a19f603 666cd impls/IMPL
60154d24
JM
667IMPL_STEPA_CMD ../mal/stepX_YYY.mal
668
669```
670
bcddc3e4 671### GNU Make 3.81
60154d24
JM
672
673```
8a19f603 674cd impls/make
60154d24
JM
675make -f stepX_YYY.mk
676```
677
331ddfed
BD
678### NASM
679
331ddfed
BD
680The NASM implementation of mal is written for x86-64 Linux, and has been tested
681with Linux 3.16.0-4-amd64 and NASM version 2.11.05.
682
683```
8a19f603 684cd impls/nasm
331ddfed
BD
685make
686./stepX_YYY
687```
688
41558f01 689### Nim 1.0.4
a2cd0a3a 690
41558f01 691The Nim implementation of mal has been tested with Nim 1.0.4.
a2cd0a3a 692
693```
8a19f603 694cd impls/nim
a2cd0a3a 695make
696 # OR
697nimble build
698./stepX_YYY
699```
700
0067158f
JM
701### Object Pascal
702
703The Object Pascal implementation of mal has been built and tested on
704Linux using the Free Pascal compiler version 2.6.2 and 2.6.4.
705
706```
8a19f603 707cd impls/objpascal
0067158f
JM
708make
709./stepX_YYY
710```
711
7cae6e6f
JM
712### Objective C
713
714The Objective C implementation of mal has been built and tested on
2faae94c
JM
715Linux using clang/LLVM 3.6. It has also been built and tested on OS
716X using XCode 7.
7cae6e6f
JM
717
718```
8a19f603 719cd impls/objc
7cae6e6f
JM
720make
721./stepX_YYY
722```
723
bc6448bc
C
724### OCaml 4.01.0
725
726```
8a19f603 727cd impls/ocaml
bc6448bc
C
728make
729./stepX_YYY
730```
731
833fc8cc 732### MATLAB (GNU Octave and MATLAB)
8a9d0a8a 733
4bb2ab37
JM
734The MatLab implementation has been tested with GNU Octave 4.2.1.
735It has also been tested with MATLAB version R2014a on Linux. Note that
736MATLAB is a commercial product.
8a9d0a8a
JM
737
738```
8a19f603 739cd impls/matlab
8a9d0a8a 740./stepX_YYY
4bb2ab37 741octave -q --no-gui --no-history --eval "stepX_YYY();quit;"
8a9d0a8a
JM
742matlab -nodisplay -nosplash -nodesktop -nojvm -r "stepX_YYY();quit;"
743 # OR with command line arguments
4bb2ab37 744octave -q --no-gui --no-history --eval "stepX_YYY('arg1','arg2');quit;"
8a9d0a8a
JM
745matlab -nodisplay -nosplash -nodesktop -nojvm -r "stepX_YYY('arg1','arg2');quit;"
746```
747
1218ce98
JM
748### miniMAL
749
750[miniMAL](https://github.com/kanaka/miniMAL) is small Lisp interpreter
751implemented in less than 1024 bytes of JavaScript. To run the miniMAL
752implementation of mal you need to download/install the miniMAL
753interpreter (which requires Node.js).
754```
8a19f603 755cd impls/miniMAL
478fd9ce
JM
756# Download miniMAL and dependencies
757npm install
758export PATH=`pwd`/node_modules/minimal-lisp/:$PATH
759# Now run mal implementation in miniMAL
1218ce98
JM
760miniMAL ./stepX_YYY
761```
762
23e3304b
BH
763### Perl 5
764
765The Perl 5 implementation should work with perl 5.19.3 and later.
9e5b2151
JM
766
767For readline line editing support, install Term::ReadLine::Perl or
768Term::ReadLine::Gnu from CPAN.
769
770```
8a19f603 771cd impls/perl
9e5b2151
JM
772perl stepX_YYY.pl
773```
774
a7081401
HÖS
775### Perl 6
776
a7081401
HÖS
777The Perl 6 implementation was tested on Rakudo Perl 6 2016.04.
778
779```
8a19f603 780cd impls/perl6
a7081401
HÖS
781perl6 stepX_YYY.pl
782```
9e5b2151 783
bcddc3e4 784### PHP 5.3
60154d24 785
01c97316
JM
786The PHP implementation of mal requires the php command line interface
787to run.
788
60154d24 789```
8a19f603 790cd impls/php
60154d24
JM
791php stepX_YYY.php
792```
793
b6263859
VS
794### Picolisp
795
b6263859
VS
796The Picolisp implementation requires libreadline and Picolisp 3.1.11
797or later.
798
799```
8a19f603 800cd impls/picolisp
b6263859
VS
801./run
802```
803
742af2bb
DM
804### Pike
805
806The Pike implementation was tested on Pike 8.0.
807
808```
8a19f603 809cd impls/pike
742af2bb
DM
810pike stepX_YYY.pike
811```
812
33102dd1 813### PL/pgSQL (PostgreSQL SQL Procedural Language)
b25bf8d8 814
33102dd1 815The PL/pgSQL implementation of mal requires a running PostgreSQL server
b88bb764 816(the "kanaka/mal-test-plpgsql" docker image automatically starts
33102dd1 817a PostgreSQL server). The implementation connects to the PostgreSQL server
b88bb764
JM
818and create a database named "mal" to store tables and stored
819procedures. The wrapper script uses the psql command to connect to the
820server and defaults to the user "postgres" but this can be overridden
821with the PSQL_USER environment variable. A password can be specified
822using the PGPASSWORD environment variable. The implementation has been
33102dd1 823tested with PostgreSQL 9.4.
b25bf8d8
JM
824
825```
8a19f603 826cd impls/plpgsql
b25bf8d8 827./wrap.sh stepX_YYY.sql
b88bb764
JM
828 # OR
829PSQL_USER=myuser PGPASSWORD=mypass ./wrap.sh stepX_YYY.sql
830```
831
832### PL/SQL (Oracle SQL Procedural Language)
833
26460a25 834The PL/SQL implementation of mal requires a running Oracle DB
b88bb764
JM
835server (the "kanaka/mal-test-plsql" docker image automatically
836starts an Oracle Express server). The implementation connects to the
837Oracle server to create types, tables and stored procedures. The
69990448 838default SQL\*Plus logon value (username/password@connect_identifier) is
b88bb764
JM
839"system/oracle" but this can be overridden with the ORACLE_LOGON
840environment variable. The implementation has been tested with Oracle
69990448 841Express Edition 11g Release 2. Note that any SQL\*Plus connection
b88bb764
JM
842warnings (user password expiration, etc) will interfere with the
843ability of the wrapper script to communicate with the DB.
844
845```
8a19f603 846cd impls/plsql
b88bb764
JM
847./wrap.sh stepX_YYY.sql
848 # OR
849ORACLE_LOGON=myuser/mypass@ORCL ./wrap.sh stepX_YYY.sql
b25bf8d8
JM
850```
851
e007416e 852### PostScript Level 2/3
5c34565f 853
e007416e
BH
854The PostScript implementation of mal requires Ghostscript to run. It
855has been tested with Ghostscript 9.10.
5c34565f
JM
856
857```
8a19f603 858cd impls/ps
5c34565f
JM
859gs -q -dNODISPLAY -I./ stepX_YYY.ps
860```
861
862### PowerShell
863
864The PowerShell implementation of mal requires the PowerShell script
865language. It has been tested with PowerShell 6.0.0 Alpha 9 on Linux.
866
867```
8a19f603 868cd impls/powershell
5c34565f
JM
869powershell ./stepX_YYY.ps1
870```
871
2d76e877 872### Python (2.X and 3.X)
60154d24
JM
873
874```
8a19f603 875cd impls/python
60154d24
JM
876python stepX_YYY.py
877```
8adb0827 878
791052af
G
879### Python.2 (3.X)
880
881The second Python implementation makes heavy use of type annotations and uses the Arpeggio parser library.
882
883```
884# Recommended: do these steps in a Python virtual environment.
885pip3 install Arpeggio==1.9.0
886python3 stepX_YYY.py
887```
888
23e38cd2
JM
889### RPython
890
891You must have [rpython](https://rpython.readthedocs.org/) on your path
892(included with [pypy](https://bitbucket.org/pypy/pypy/)).
893
894```
8a19f603 895cd impls/rpython
4e8d7c28 896make # this takes a very long time
23e38cd2
JM
897./stepX_YYY
898```
899
9b3362e8
JM
900### R
901
902The R implementation of mal requires R (r-base-core) to run.
903
904```
8a19f603 905cd impls/r
9d42904e 906make libs # to download and build rdyncall
f5223195
JM
907Rscript stepX_YYY.r
908```
909
910### Racket (5.3)
911
912The Racket implementation of mal requires the Racket
913compiler/interpreter to run.
914
915```
8a19f603 916cd impls/racket
3796240a 917./stepX_YYY.rkt
9b3362e8
JM
918```
919
44a3e2ef
DM
920### Rexx
921
44a3e2ef
DM
922The Rexx implementation of mal has been tested with Regina Rexx 3.6.
923
924```
8a19f603 925cd impls/rexx
44a3e2ef
DM
926make
927rexx -a ./stepX_YYY.rexxpp
928```
929
107d9694 930### Ruby (1.9+)
8adb0827
JM
931
932```
8a19f603 933cd impls/ruby
8adb0827
JM
934ruby stepX_YYY.rb
935```
592eb5cf 936
bcb7af31 937### Rust (1.38+)
abdd56eb
JM
938
939The rust implementation of mal requires the rust compiler and build
940tool (cargo) to build.
941
942```
8a19f603 943cd impls/rust
bbeb1b87 944cargo run --release --bin stepX_YYY
abdd56eb
JM
945```
946
821930db
JM
947### Scala ###
948
949Install scala and sbt (http://www.scala-sbt.org/0.13/tutorial/Installing-sbt-on-Linux.html):
950
951```
8a19f603 952cd impls/scala
821930db
JM
953sbt 'run-main stepX_YYY'
954 # OR
955sbt compile
956scala -classpath target/scala*/classes stepX_YYY
957```
958
6c0968a6 959### Scheme (R7RS) ###
ff3a8bf8 960
ff3a8bf8
VS
961The Scheme implementation of mal has been tested with Chibi-Scheme
9620.7.3, Kawa 2.4, Gauche 0.9.5, CHICKEN 4.11.0, Sagittarius 0.8.3,
963Cyclone 0.6.3 (Git version) and Foment 0.4 (Git version). You should
964be able to get it running on other conforming R7RS implementations
965after figuring out how libraries are loaded and adjusting the
966`Makefile` and `run` script accordingly.
967
968```
8a19f603 969cd impls/scheme
ff3a8bf8
VS
970make symlinks
971# chibi
6c0968a6 972scheme_MODE=chibi ./run
ff3a8bf8
VS
973# kawa
974make kawa
6c0968a6 975scheme_MODE=kawa ./run
ff3a8bf8 976# gauche
6c0968a6 977scheme_MODE=gauche ./run
ff3a8bf8
VS
978# chicken
979make chicken
6c0968a6 980scheme_MODE=chicken ./run
ff3a8bf8 981# sagittarius
6c0968a6 982scheme_MODE=sagittarius ./run
ff3a8bf8
VS
983# cyclone
984make cyclone
6c0968a6 985scheme_MODE=cyclone ./run
ff3a8bf8 986# foment
6c0968a6 987scheme_MODE=foment ./run
ff3a8bf8
VS
988```
989
034e82ad
DM
990### Skew ###
991
034e82ad
DM
992The Skew implementation of mal has been tested with Skew 0.7.42.
993
994```
8a19f603 995cd impls/skew
034e82ad
DM
996make
997node stepX_YYY.js
998```
999
1000
2539e6af
KR
1001### Swift
1002
e31349f6
KR
1003The Swift implementation of mal requires the Swift 2.0 compiler (XCode
10047.0) to build. Older versions will not work due to changes in the
1005language and standard library.
8b142f08 1006
2539e6af 1007```
8a19f603 1008cd impls/swift
2539e6af
KR
1009make
1010./stepX_YYY
1011```
1012
ea1395aa
JM
1013### Swift 3
1014
1015The Swift 3 implementation of mal requires the Swift 3.0 compiler. It
a3a6f680 1016has been tested with Swift 3 Preview 3.
ea1395aa
JM
1017
1018```
8a19f603 1019cd impls/swift3
ea1395aa
JM
1020make
1021./stepX_YYY
1022```
1023
2c1c2660 1024### Swift 4
1025
1026The Swift 4 implementation of mal requires the Swift 4.0 compiler. It
1027has been tested with Swift 4.2.3 release.
1028
1029```
8a19f603 1030cd impls/swift4
2c1c2660 1031make
1032./stepX_YYY
1033```
1034
6aa9c258
OM
1035### Swift 5
1036
1037The Swift 5 implementation of mal requires the Swift 5.0 compiler. It
1038has been tested with Swift 5.1.1 release.
1039
1040```
8a19f603 1041cd impls/swift5
b667adf5 1042swift run stepX_YYY
6aa9c258
OM
1043```
1044
54d9903c
DM
1045### Tcl 8.6
1046
54d9903c
DM
1047The Tcl implementation of mal requires Tcl 8.6 to run. For readline line
1048editing support, install tclreadline.
1049
1050```
8a19f603 1051cd impls/tcl
54d9903c
DM
1052tclsh ./stepX_YYY.tcl
1053```
1054
c527d565 1055### TypeScript
1056
1057The TypeScript implementation of mal requires the TypeScript 2.2 compiler.
db885df9 1058It has been tested with Node.js v6.
c527d565 1059
1060```
8a19f603 1061cd impls/ts
c527d565 1062make
1063node ./stepX_YYY.js
1064```
1065
213a3288
ST
1066### Vala
1067
1068The Vala implementation of mal has been tested with the Vala 0.40.8
1069compiler. You will need to install `valac` and `libreadline-dev` or
1070equivalent.
1071
1072```
8a19f603 1073cd impls/vala
213a3288
ST
1074make
1075./stepX_YYY
1076```
1077
36e91db4
DM
1078### VHDL
1079
36e91db4
DM
1080The VHDL implementation of mal has been tested with GHDL 0.29.
1081
1082```
8a19f603 1083cd impls/vhdl
36e91db4
DM
1084make
1085./run_vhdl.sh ./stepX_YYY
1086```
1087
50a964ce
DM
1088### Vimscript
1089
aa62cbda 1090The Vimscript implementation of mal requires Vim 8.0 to run.
50a964ce
DM
1091
1092```
8a19f603 1093cd impls/vimscript
50a964ce
DM
1094./run_vimscript.sh ./stepX_YYY.vim
1095```
1096
ee7cd585
JM
1097### Visual Basic.NET ###
1098
1099The VB.NET implementation of mal has been tested on Linux using the Mono
1100VB compiler (vbnc) and the Mono runtime (version 2.10.8.1). Both are
1101required to build and run the VB.NET implementation.
1102
1103```
8a19f603 1104cd impls/vb
ee7cd585
JM
1105make
1106mono ./stepX_YYY.exe
1107```
1108
d72395aa
JM
1109### WebAssembly (wasm) ###
1110
27359631 1111The WebAssembly implementation is written in
d72395aa 1112[Wam](https://github.com/kanaka/wam) (WebAssembly Macro language) and
d88adace 1113runs under several different non-web embeddings (runtimes):
9a7485aa 1114[node](https://nodejs.org),
d88adace 1115[wasmtime](https://github.com/CraneStation/wasmtime),
9a7485aa
JM
1116[wasmer](https://wasmer.io),
1117[lucet](https://github.com/fastly/lucet),
030f725c 1118[wax](https://github.com/kanaka/wac),
d88adace
JM
1119[wace](https://github.com/kanaka/wac),
1120[warpy](https://github.com/kanaka/warpy).
d72395aa
JM
1121
1122```
8a19f603 1123cd impls/wasm
d88adace
JM
1124# node
1125make wasm_MODE=node
1126./run.js ./stepX_YYY.wasm
1127# wasmtime
1128make wasm_MODE=wasmtime
1129wasmtime --dir=./ --dir=../ --dir=/ ./stepX_YYY.wasm
9a7485aa
JM
1130# wasmer
1131make wasm_MODE=wasmer
1132wasmer run --dir=./ --dir=../ --dir=/ ./stepX_YYY.wasm
1133# lucet
1134make wasm_MODE=lucet
1135lucet-wasi --dir=./:./ --dir=../:../ --dir=/:/ ./stepX_YYY.so
030f725c
JM
1136# wax
1137make wasm_MODE=wax
9a7485aa 1138wax ./stepX_YYY.wasm
d88adace
JM
1139# wace
1140make wasm_MODE=wace_libc
d72395aa 1141wace ./stepX_YYY.wasm
d88adace
JM
1142# warpy
1143make wasm_MODE=warpy
1144warpy --argv --memory-pages 256 ./stepX_YYY.wasm
d72395aa
JM
1145```
1146
84eaa11c
DM
1147### Wren
1148
1149The Wren implementation of mal was tested on Wren 0.2.0.
1150
1151```
8a19f603 1152cd impls/wren
84eaa11c
DM
1153wren ./stepX_YYY.wren
1154```
1155
a3665311
DM
1156### Yorick
1157
a3665311
DM
1158The Yorick implementation of mal was tested on Yorick 2.2.04.
1159
1160```
8a19f603 1161cd impls/yorick
a3665311
DM
1162yorick -batch ./stepX_YYY.i
1163```
97a8edea
JT
1164
1165### Zig
1166
1167The Zig implementation of mal was tested on Zig 0.5.
1168
1169```
8a19f603 1170cd impls/zig
97a8edea
JT
1171zig build stepX_YYY
1172```
a3665311 1173
ee7cd585
JM
1174
1175
592eb5cf
JM
1176## Running tests
1177
d57f74df
JM
1178The top level Makefile has a number of useful targets to assist with
1179implementation development and testing. The `help` target provides
1180a list of the targets and options:
1181
1182```
1183make help
1184```
1185
294aba2c
JM
1186### Functional tests
1187
9a7485aa 1188The are almost 800 generic functional tests (for all implementations)
294aba2c
JM
1189in the `tests/` directory. Each step has a corresponding test file
1190containing tests specific to that step. The `runtest.py` test harness
bd62ff74
JM
1191launches a Mal step implementation and then feeds the tests one at
1192a time to the implementation and compares the output/return value to
1193the expected output/return value.
592eb5cf 1194
592eb5cf
JM
1195* To run all the tests across all implementations (be prepared to wait):
1196
1197```
1198make test
1199```
1200
1201* To run all tests against a single implementation:
1202
1203```
e5737b08 1204make "test^IMPL"
592eb5cf
JM
1205
1206# e.g.
e5737b08
SL
1207make "test^clojure"
1208make "test^js"
592eb5cf
JM
1209```
1210
1211* To run tests for a single step against all implementations:
1212
1213```
e5737b08 1214make "test^stepX"
592eb5cf
JM
1215
1216# e.g.
e5737b08
SL
1217make "test^step2"
1218make "test^step7"
592eb5cf
JM
1219```
1220
4c58cd4e 1221* To run tests for a specific step against a single implementation:
592eb5cf
JM
1222
1223```
e5737b08 1224make "test^IMPL^stepX"
592eb5cf
JM
1225
1226# e.g
e5737b08
SL
1227make "test^ruby^step3"
1228make "test^ps^step4"
592eb5cf 1229```
fd888612 1230
294aba2c
JM
1231### Self-hosted functional tests
1232
1233* To run the functional tests in self-hosted mode, you specify `mal`
1234 as the test implementation and use the `MAL_IMPL` make variable
1235 to change the underlying host language (default is JavaScript):
1236```
e5737b08 1237make MAL_IMPL=IMPL "test^mal^step2"
294aba2c
JM
1238
1239# e.g.
e5737b08
SL
1240make "test^mal^step2" # js is default
1241make MAL_IMPL=ruby "test^mal^step2"
1242make MAL_IMPL=python "test^mal^step2"
294aba2c
JM
1243```
1244
854cf2a6
DM
1245### Starting the REPL
1246
1247* To start the REPL of an implementation in a specific step:
1248
1249```
1250make "repl^IMPL^stepX"
1251
1252# e.g
1253make "repl^ruby^step3"
1254make "repl^ps^step4"
1255```
1256
1257* If you omit the step, then `stepA` is used:
1258
1259```
1260make "repl^IMPL"
1261
1262# e.g
1263make "repl^ruby"
1264make "repl^ps"
1265```
1266
1267* To start the REPL of the self-hosted implementation, specify `mal` as the
1268 REPL implementation and use the `MAL_IMPL` make variable to change the
1269 underlying host language (default is JavaScript):
1270```
1271make MAL_IMPL=IMPL "repl^mal^stepX"
1272
1273# e.g.
1274make "repl^mal^step2" # js is default
1275make MAL_IMPL=ruby "repl^mal^step2"
1276make MAL_IMPL=python "repl^mal"
1277```
294aba2c
JM
1278
1279### Performance tests
1280
8569b2af
JM
1281Warning: These performance tests are neither statistically valid nor
1282comprehensive; runtime performance is a not a primary goal of mal. If
1283you draw any serious conclusions from these performance tests, then
1284please contact me about some amazing oceanfront property in Kansas
1285that I'm willing to sell you for cheap.
1286
294aba2c
JM
1287* To run performance tests against a single implementation:
1288```
e5737b08 1289make "perf^IMPL"
294aba2c
JM
1290
1291# e.g.
e5737b08 1292make "perf^js"
294aba2c
JM
1293```
1294
1295* To run performance tests against all implementations:
1296```
e5737b08 1297make "perf"
294aba2c
JM
1298```
1299
1300### Generating language statistics
1301
4c58cd4e 1302* To report line and byte statistics for a single implementation:
294aba2c 1303```
e5737b08 1304make "stats^IMPL"
294aba2c
JM
1305
1306# e.g.
e5737b08 1307make "stats^js"
294aba2c
JM
1308```
1309
5b207de7 1310## Dockerized testing
75363567 1311
5b207de7
JM
1312Every implementation directory contains a Dockerfile to create
1313a docker image containing all the dependencies for that
1314implementation. In addition, the top-level Makefile contains support
1315for running the tests target (and perf, stats, repl, etc) within
1316a docker container for that implementation by passing *"DOCKERIZE=1"*
1317on the make command line. For example:
75363567 1318
75363567 1319```
5b207de7 1320make DOCKERIZE=1 "test^js^step3"
75363567
JM
1321```
1322
5b207de7
JM
1323Existing implementations already have docker images built and pushed
1324to the docker registry. However, if
1325you wish to build or rebuild a docker image locally, the toplevel
1326Makefile provides a rule for building docker images:
1327
75363567 1328```
5b207de7
JM
1329make "docker-build^IMPL"
1330```
1331
75363567
JM
1332
1333**Notes**:
5b207de7
JM
1334* Docker images are named *"kanaka/mal-test-IMPL"*
1335* JVM-based language implementations (Groovy, Java, Clojure, Scala):
70cefa38
RM
1336 you will probably need to run this command once manually
1337 first `make DOCKERIZE=1 "repl^IMPL"` before you can run tests because
5b207de7 1338 runtime dependencies need to be downloaded to avoid the tests timing
70cefa38 1339 out. These dependencies are downloaded to dot-files in the /mal
5b207de7 1340 directory so they will persist between runs.
75363567 1341
07734c09 1342
fd888612
JM
1343## License
1344
1345Mal (make-a-lisp) is licensed under the MPL 2.0 (Mozilla Public
1346License 2.0). See LICENSE.txt for more details.