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