Merge pull request #493 from alimpfard/patch-3
[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
0b25243b 9**2. Mal is implemented in 81 languages (84 different implementations and 104 runtime modes)**
bcddc3e4 10
c5cd05ae
JM
11| Language | Creator |
12| -------- | ------- |
13| [Ada](#ada) | [Chris Moore](https://github.com/zmower) |
6d9e1684 14| [Ada #2](#ada2) | [Nicolas Boulenguez](https://github.com/asarhaddon) |
833fc8cc 15| [GNU Awk](#gnu-awk) | [Miutsuru Kariya](https://github.com/kariya-mitsuru) |
c5cd05ae
JM
16| [Bash 4](#bash-4) | [Joel Martin](https://github.com/kanaka) |
17| [BASIC](#basic-c64-and-qbasic) (C64 & QBasic) | [Joel Martin](https://github.com/kanaka) |
45c103e6 18| [BBC BASIC V](#bbc-basic-v) | [Ben Harris](https://github.com/bjh21) |
c5cd05ae
JM
19| [C](#c) | [Joel Martin](https://github.com/kanaka) |
20| [C++](#c-1) | [Stephen Thirlwall](https://github.com/sdt) |
21| [C#](#c-2) | [Joel Martin](https://github.com/kanaka) |
22| [ChucK](#chuck) | [Vasilij Schneidermann](https://github.com/wasamasa) |
c5cd05ae
JM
23| [Clojure](#clojure) (Clojure & ClojureScript) | [Joel Martin](https://github.com/kanaka) |
24| [CoffeeScript](#coffeescript) | [Joel Martin](https://github.com/kanaka) |
833fc8cc 25| [Common Lisp](#common-lisp) | [Iqbal Ansari](https://github.com/iqbalansari) |
c5cd05ae
JM
26| [Crystal](#crystal) | [Linda_pp](https://github.com/rhysd) |
27| [D](#d) | [Dov Murik](https://github.com/dubek) |
28| [Dart](#dart) | [Harry Terkelsen](https://github.com/hterkelsen) |
29| [Elixir](#elixir) | [Martin Ek](https://github.com/ekmartin) |
30| [Elm](#elm) | [Jos van Bakel](https://github.com/c0deaddict) |
31| [Emacs Lisp](#emacs-lisp) | [Vasilij Schneidermann](https://github.com/wasamasa) |
32| [Erlang](#erlang) | [Nathan Fiedler](https://github.com/nlfiedler) |
33| [ES6](#es6-ecmascript-2015) (ECMAScript 2015) | [Joel Martin](https://github.com/kanaka) |
34| [F#](#f) | [Peter Stephens](https://github.com/pstephens) |
35| [Factor](#factor) | [Jordan Lewis](https://github.com/jordanlewis) |
36| [Fantom](#fantom) | [Dov Murik](https://github.com/dubek) |
37| [Forth](#forth) | [Chris Houser](https://github.com/chouser) |
c5cd05ae
JM
38| [GNU Guile](#gnu-guile-21) | [Mu Lei](https://github.com/NalaGinrut) |
39| [GNU Smalltalk](#gnu-smalltalk) | [Vasilij Schneidermann](https://github.com/wasamasa) |
833fc8cc
JM
40| [Go](#go) | [Joel Martin](https://github.com/kanaka) |
41| [Groovy](#groovy) | [Joel Martin](https://github.com/kanaka) |
c5cd05ae
JM
42| [Haskell](#haskell) | [Joel Martin](https://github.com/kanaka) |
43| [Haxe](#haxe-neko-python-c-and-javascript) (Neko, Python, C++, & JS) | [Joel Martin](https://github.com/kanaka) |
44| [Hy](#hy) | [Joel Martin](https://github.com/kanaka) |
45| [Io](#io) | [Dov Murik](https://github.com/dubek) |
46| [Java](#java-17) | [Joel Martin](https://github.com/kanaka) |
47| [JavaScript](#javascriptnode) ([Demo](http://kanaka.github.io/mal)) | [Joel Martin](https://github.com/kanaka) |
0b25243b 48| [Jq](#jq) | [Ali MohammadPur](https://github.com/alimpfard) |
c5cd05ae
JM
49| [Julia](#julia) | [Joel Martin](https://github.com/kanaka) |
50| [Kotlin](#kotlin) | [Javier Fernandez-Ivern](https://github.com/ivern) |
51| [LiveScript](#livescript) | [Jos van Bakel](https://github.com/c0deaddict) |
52| [Logo](#logo) | [Dov Murik](https://github.com/dubek) |
53| [Lua](#lua) | [Joel Martin](https://github.com/kanaka) |
54| [GNU Make](#gnu-make-381) | [Joel Martin](https://github.com/kanaka) |
55| [mal itself](#mal) | [Joel Martin](https://github.com/kanaka) |
833fc8cc 56| [MATLAB](#matlab-gnu-octave-and-matlab) (GNU Octave & MATLAB) | [Joel Martin](https://github.com/kanaka) |
c5cd05ae
JM
57| [miniMAL](#minimal) ([Repo](https://github.com/kanaka/miniMAL), [Demo](https://kanaka.github.io/miniMAL/)) | [Joel Martin](https://github.com/kanaka) |
58| [NASM](#nasm) | [Ben Dudson](https://github.com/bendudson) |
41558f01 59| [Nim](#nim-104) | [Dennis Felsing](https://github.com/def-) |
c5cd05ae
JM
60| [Object Pascal](#object-pascal) | [Joel Martin](https://github.com/kanaka) |
61| [Objective C](#objective-c) | [Joel Martin](https://github.com/kanaka) |
62| [OCaml](#ocaml-4010) | [Chris Houser](https://github.com/chouser) |
23e3304b 63| [Perl](#perl-5) | [Joel Martin](https://github.com/kanaka) |
c5cd05ae
JM
64| [Perl 6](#perl-6) | [Hinrik Örn Sigurðsson](https://github.com/hinrik) |
65| [PHP](#php-53) | [Joel Martin](https://github.com/kanaka) |
66| [Picolisp](#picolisp) | [Vasilij Schneidermann](https://github.com/wasamasa) |
742af2bb 67| [Pike](#pike) | [Dov Murik](https://github.com/dubek) |
33102dd1 68| [PL/pgSQL](#plpgsql-postgresql-sql-procedural-language) (PostgreSQL) | [Joel Martin](https://github.com/kanaka) |
c5cd05ae 69| [PL/SQL](#plsql-oracle-sql-procedural-language) (Oracle) | [Joel Martin](https://github.com/kanaka) |
833fc8cc 70| [PostScript](#postscript-level-23) | [Joel Martin](https://github.com/kanaka) |
c5cd05ae
JM
71| [PowerShell](#powershell) | [Joel Martin](https://github.com/kanaka) |
72| [Python](#python-2x-and-3x) (2.X & 3.X) | [Joel Martin](https://github.com/kanaka) |
8501fcab 73| [Python #2](#python2-3x) (3.X) | [Gavin Lewis](https://github.com/epylar) |
c5cd05ae
JM
74| [RPython](#rpython) | [Joel Martin](https://github.com/kanaka) |
75| [R](#r) | [Joel Martin](https://github.com/kanaka) |
76| [Racket](#racket-53) | [Joel Martin](https://github.com/kanaka) |
77| [Rexx](#rexx) | [Dov Murik](https://github.com/dubek) |
78| [Ruby](#ruby-19) | [Joel Martin](https://github.com/kanaka) |
bcb7af31 79| [Rust](#rust-138) | [Joel Martin](https://github.com/kanaka) |
c5cd05ae
JM
80| [Scala](#scala) | [Joel Martin](https://github.com/kanaka) |
81| [Scheme (R7RS)](#scheme-r7rs) | [Vasilij Schneidermann](https://github.com/wasamasa) |
82| [Skew](#skew) | [Dov Murik](https://github.com/dubek) |
833fc8cc 83| [Swift 2](#swift) | [Keith Rollin](https://github.com/keith-rollin) |
c5cd05ae 84| [Swift 3](#swift-3) | [Joel Martin](https://github.com/kanaka) |
2c1c2660 85| [Swift 4](#swift-4) | [陆遥](https://github.com/LispLY) |
6aa9c258 86| [Swift 5](#swift-5) | [Oleg Montak](https://github.com/MontakOleg) |
c5cd05ae
JM
87| [Tcl](#tcl-86) | [Dov Murik](https://github.com/dubek) |
88| [TypeScript](#typescript) | [Masahiro Wakame](https://github.com/vvakame) |
213a3288 89| [Vala](#vala) | [Simon Tatham](https://github.com/sgtatham) |
c5cd05ae
JM
90| [VHDL](#vhdl) | [Dov Murik](https://github.com/dubek) |
91| [Vimscript](#vimscript) | [Dov Murik](https://github.com/dubek) |
92| [Visual Basic.NET](#visual-basicnet) | [Joel Martin](https://github.com/kanaka) |
93| [WebAssembly](#webassembly-wasm) (wasm) | [Joel Martin](https://github.com/kanaka) |
84eaa11c 94| [Wren](#wren) | [Dov Murik](https://github.com/dubek) |
c5cd05ae 95| [Yorick](#yorick) | [Dov Murik](https://github.com/dubek) |
97a8edea 96| [Zig](#zig) | [Josh Tobin](https://github.com/rjtobin) |
bcddc3e4
JM
97
98
5b6498bc
JM
99**3. Mal is a learning tool**
100
101Each implementation of mal is separated into
bd08422d
JM
10211 incremental, self-contained (and testable) steps that demonstrate
103core concepts of Lisp. The last step is capable of self-hosting
5b6498bc
JM
104(running the mal implementation of mal). See the [make-a-lisp process
105guide](process/guide.md).
bcddc3e4 106
5b6498bc 107The make-a-lisp steps are:
bcddc3e4 108
0f4ca9d1
JM
109* [step0_repl](process/guide.md#step0)
110* [step1_read_print](process/guide.md#step1)
111* [step2_eval](process/guide.md#step2)
112* [step3_env](process/guide.md#step3)
113* [step4_if_fn_do](process/guide.md#step4)
114* [step5_tco](process/guide.md#step5)
115* [step6_file](process/guide.md#step6)
116* [step7_quote](process/guide.md#step7)
117* [step8_macros](process/guide.md#step8)
118* [step9_try](process/guide.md#step9)
90f618cb 119* [stepA_mal](process/guide.md#stepA)
bcddc3e4 120
138cbb9c
JM
121Each make-a-lisp step has an associated architectural diagram. That elements
122that are new for that step are highlighted in red.
123Here is the final diagram for [step A](process/guide.md#stepA):
5b6498bc
JM
124
125![stepA_mal architecture](process/stepA_mal.png)
126
98a83a87 127If you are interested in creating a mal implementation (or just
5b6498bc
JM
128interested in using mal for something), please drop by the #mal
129channel on freenode. In addition to the [make-a-lisp process
130guide](process/guide.md) there is also a [mal/make-a-lisp
131FAQ](docs/FAQ.md) where I attempt to answer some common questions.
132
133
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```
200cd ada
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```
211cd ada
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```
221cd gawk
222gawk -O -f stepX_YYY.awk
223```
224
bcddc3e4 225### Bash 4
60154d24
JM
226
227```
228cd bash
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```
244cd basic
245make stepX_YYY.bas
246STEP=stepX_YYY ./run
247```
248
249Generate QBasic code and load it into qb64:
250
251```
252cd basic
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```
265cd bbc-basic
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
JM
283```
284cd c
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```
296cd cpp
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```
311cd cs
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```
321cd chuck
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
JM
330```
331cd clojure
332lein with-profile +stepX trampoline run
333```
334
891c3f3b
JM
335### CoffeeScript
336
337```
338sudo npm install -g coffee-script
339cd coffee
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```
351cd common-lisp
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```
361cd crystal
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```
374cd d
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```
384cd dart
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```
396cd elisp
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```
407cd 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```
418cd elm
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```
429cd 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```
443cd es6
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```
457cd fsharp
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
JL
467```
468cd 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```
477cd fantom
478make lib/fan/stepX_YYY.pod
479STEP=stepX_YYY ./run
480```
481
96032890
C
482### Forth
483
484```
485cd forth
486gforth stepX_YYY.fs
487```
488
833fc8cc
JM
489### GNU Guile 2.1+
490
491```
492cd guile
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```
501cd gnu-smalltalk
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
JM
510```
511cd go
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```
523cd groovy
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```
534cd haskell
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```
546cd haxe
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```
566cd hy
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```
575cd io
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
JM
583```
584cd java
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```
594cd 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```
604cd julia
605julia stepX_YYY.jl
606```
607
0b25243b
A
608### Jq
609
610Tested against version 1.6, with a lot of cheating in the IO department
611
612```
613cd jq
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```
624cd kotlin
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```
634cd livescript
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```
644cd logo
645logo stepX_YYY.lg
646```
647
9d42904e
JM
648### Lua
649
45a71498
JM
650The Lua implementation of mal has been tested with Lua 5.2. The
651implementation requires that luarocks and the lua-rex-pcre library
652are installed.
9d42904e
JM
653
654```
655cd lua
656make # to build and link linenoise.so
657./stepX_YYY.lua
658```
659
bcddc3e4 660### Mal
60154d24
JM
661
662Running the mal implementation of mal involves running stepA of one of
663the other implementations and passing the mal step to run as a command
5d446bd8 664line argument.
60154d24
JM
665
666```
667cd IMPL
668IMPL_STEPA_CMD ../mal/stepX_YYY.mal
669
670```
671
bcddc3e4 672### GNU Make 3.81
60154d24
JM
673
674```
675cd make
676make -f stepX_YYY.mk
677```
678
331ddfed
BD
679### NASM
680
331ddfed
BD
681The NASM implementation of mal is written for x86-64 Linux, and has been tested
682with Linux 3.16.0-4-amd64 and NASM version 2.11.05.
683
684```
685cd nasm
686make
687./stepX_YYY
688```
689
41558f01 690### Nim 1.0.4
a2cd0a3a 691
41558f01 692The Nim implementation of mal has been tested with Nim 1.0.4.
a2cd0a3a 693
694```
695cd nim
696make
697 # OR
698nimble build
699./stepX_YYY
700```
701
0067158f
JM
702### Object Pascal
703
704The Object Pascal implementation of mal has been built and tested on
705Linux using the Free Pascal compiler version 2.6.2 and 2.6.4.
706
707```
708cd objpascal
709make
710./stepX_YYY
711```
712
7cae6e6f
JM
713### Objective C
714
715The Objective C implementation of mal has been built and tested on
2faae94c
JM
716Linux using clang/LLVM 3.6. It has also been built and tested on OS
717X using XCode 7.
7cae6e6f
JM
718
719```
720cd objc
721make
722./stepX_YYY
723```
724
bc6448bc
C
725### OCaml 4.01.0
726
727```
728cd ocaml
729make
730./stepX_YYY
731```
732
833fc8cc 733### MATLAB (GNU Octave and MATLAB)
8a9d0a8a 734
4bb2ab37
JM
735The MatLab implementation has been tested with GNU Octave 4.2.1.
736It has also been tested with MATLAB version R2014a on Linux. Note that
737MATLAB is a commercial product.
8a9d0a8a
JM
738
739```
740cd matlab
741./stepX_YYY
4bb2ab37 742octave -q --no-gui --no-history --eval "stepX_YYY();quit;"
8a9d0a8a
JM
743matlab -nodisplay -nosplash -nodesktop -nojvm -r "stepX_YYY();quit;"
744 # OR with command line arguments
4bb2ab37 745octave -q --no-gui --no-history --eval "stepX_YYY('arg1','arg2');quit;"
8a9d0a8a
JM
746matlab -nodisplay -nosplash -nodesktop -nojvm -r "stepX_YYY('arg1','arg2');quit;"
747```
748
1218ce98
JM
749### miniMAL
750
751[miniMAL](https://github.com/kanaka/miniMAL) is small Lisp interpreter
752implemented in less than 1024 bytes of JavaScript. To run the miniMAL
753implementation of mal you need to download/install the miniMAL
754interpreter (which requires Node.js).
755```
1218ce98 756cd miniMAL
478fd9ce
JM
757# Download miniMAL and dependencies
758npm install
759export PATH=`pwd`/node_modules/minimal-lisp/:$PATH
760# Now run mal implementation in miniMAL
1218ce98
JM
761miniMAL ./stepX_YYY
762```
763
23e3304b
BH
764### Perl 5
765
766The Perl 5 implementation should work with perl 5.19.3 and later.
9e5b2151
JM
767
768For readline line editing support, install Term::ReadLine::Perl or
769Term::ReadLine::Gnu from CPAN.
770
771```
772cd perl
773perl stepX_YYY.pl
774```
775
a7081401
HÖS
776### Perl 6
777
a7081401
HÖS
778The Perl 6 implementation was tested on Rakudo Perl 6 2016.04.
779
780```
781cd perl6
782perl6 stepX_YYY.pl
783```
9e5b2151 784
bcddc3e4 785### PHP 5.3
60154d24 786
01c97316
JM
787The PHP implementation of mal requires the php command line interface
788to run.
789
60154d24
JM
790```
791cd php
792php stepX_YYY.php
793```
794
b6263859
VS
795### Picolisp
796
b6263859
VS
797The Picolisp implementation requires libreadline and Picolisp 3.1.11
798or later.
799
800```
b440380f 801cd picolisp
b6263859
VS
802./run
803```
804
742af2bb
DM
805### Pike
806
807The Pike implementation was tested on Pike 8.0.
808
809```
810cd pike
811pike stepX_YYY.pike
812```
813
33102dd1 814### PL/pgSQL (PostgreSQL SQL Procedural Language)
b25bf8d8 815
33102dd1 816The PL/pgSQL implementation of mal requires a running PostgreSQL server
b88bb764 817(the "kanaka/mal-test-plpgsql" docker image automatically starts
33102dd1 818a PostgreSQL server). The implementation connects to the PostgreSQL server
b88bb764
JM
819and create a database named "mal" to store tables and stored
820procedures. The wrapper script uses the psql command to connect to the
821server and defaults to the user "postgres" but this can be overridden
822with the PSQL_USER environment variable. A password can be specified
823using the PGPASSWORD environment variable. The implementation has been
33102dd1 824tested with PostgreSQL 9.4.
b25bf8d8
JM
825
826```
827cd plpgsql
828./wrap.sh stepX_YYY.sql
b88bb764
JM
829 # OR
830PSQL_USER=myuser PGPASSWORD=mypass ./wrap.sh stepX_YYY.sql
831```
832
833### PL/SQL (Oracle SQL Procedural Language)
834
26460a25 835The PL/SQL implementation of mal requires a running Oracle DB
b88bb764
JM
836server (the "kanaka/mal-test-plsql" docker image automatically
837starts an Oracle Express server). The implementation connects to the
838Oracle server to create types, tables and stored procedures. The
69990448 839default SQL\*Plus logon value (username/password@connect_identifier) is
b88bb764
JM
840"system/oracle" but this can be overridden with the ORACLE_LOGON
841environment variable. The implementation has been tested with Oracle
69990448 842Express Edition 11g Release 2. Note that any SQL\*Plus connection
b88bb764
JM
843warnings (user password expiration, etc) will interfere with the
844ability of the wrapper script to communicate with the DB.
845
846```
847cd plsql
848./wrap.sh stepX_YYY.sql
849 # OR
850ORACLE_LOGON=myuser/mypass@ORCL ./wrap.sh stepX_YYY.sql
b25bf8d8
JM
851```
852
e007416e 853### PostScript Level 2/3
5c34565f 854
e007416e
BH
855The PostScript implementation of mal requires Ghostscript to run. It
856has been tested with Ghostscript 9.10.
5c34565f
JM
857
858```
859cd ps
860gs -q -dNODISPLAY -I./ stepX_YYY.ps
861```
862
863### PowerShell
864
865The PowerShell implementation of mal requires the PowerShell script
866language. It has been tested with PowerShell 6.0.0 Alpha 9 on Linux.
867
868```
869cd powershell
870powershell ./stepX_YYY.ps1
871```
872
2d76e877 873### Python (2.X and 3.X)
60154d24
JM
874
875```
876cd python
877python stepX_YYY.py
878```
8adb0827 879
791052af
G
880### Python.2 (3.X)
881
882The second Python implementation makes heavy use of type annotations and uses the Arpeggio parser library.
883
884```
885# Recommended: do these steps in a Python virtual environment.
886pip3 install Arpeggio==1.9.0
887python3 stepX_YYY.py
888```
889
23e38cd2
JM
890### RPython
891
892You must have [rpython](https://rpython.readthedocs.org/) on your path
893(included with [pypy](https://bitbucket.org/pypy/pypy/)).
894
895```
896cd rpython
4e8d7c28 897make # this takes a very long time
23e38cd2
JM
898./stepX_YYY
899```
900
9b3362e8
JM
901### R
902
903The R implementation of mal requires R (r-base-core) to run.
904
905```
906cd r
9d42904e 907make libs # to download and build rdyncall
f5223195
JM
908Rscript stepX_YYY.r
909```
910
911### Racket (5.3)
912
913The Racket implementation of mal requires the Racket
914compiler/interpreter to run.
915
916```
917cd racket
3796240a 918./stepX_YYY.rkt
9b3362e8
JM
919```
920
44a3e2ef
DM
921### Rexx
922
44a3e2ef
DM
923The Rexx implementation of mal has been tested with Regina Rexx 3.6.
924
925```
926cd rexx
927make
928rexx -a ./stepX_YYY.rexxpp
929```
930
107d9694 931### Ruby (1.9+)
8adb0827
JM
932
933```
934cd ruby
935ruby stepX_YYY.rb
936```
592eb5cf 937
bcb7af31 938### Rust (1.38+)
abdd56eb
JM
939
940The rust implementation of mal requires the rust compiler and build
941tool (cargo) to build.
942
943```
944cd rust
bbeb1b87 945cargo run --release --bin stepX_YYY
abdd56eb
JM
946```
947
821930db
JM
948### Scala ###
949
950Install scala and sbt (http://www.scala-sbt.org/0.13/tutorial/Installing-sbt-on-Linux.html):
951
952```
953cd scala
954sbt 'run-main stepX_YYY'
955 # OR
956sbt compile
957scala -classpath target/scala*/classes stepX_YYY
958```
959
6c0968a6 960### Scheme (R7RS) ###
ff3a8bf8 961
ff3a8bf8
VS
962The Scheme implementation of mal has been tested with Chibi-Scheme
9630.7.3, Kawa 2.4, Gauche 0.9.5, CHICKEN 4.11.0, Sagittarius 0.8.3,
964Cyclone 0.6.3 (Git version) and Foment 0.4 (Git version). You should
965be able to get it running on other conforming R7RS implementations
966after figuring out how libraries are loaded and adjusting the
967`Makefile` and `run` script accordingly.
968
969```
a7b8df67 970cd scheme
ff3a8bf8
VS
971make symlinks
972# chibi
6c0968a6 973scheme_MODE=chibi ./run
ff3a8bf8
VS
974# kawa
975make kawa
6c0968a6 976scheme_MODE=kawa ./run
ff3a8bf8 977# gauche
6c0968a6 978scheme_MODE=gauche ./run
ff3a8bf8
VS
979# chicken
980make chicken
6c0968a6 981scheme_MODE=chicken ./run
ff3a8bf8 982# sagittarius
6c0968a6 983scheme_MODE=sagittarius ./run
ff3a8bf8
VS
984# cyclone
985make cyclone
6c0968a6 986scheme_MODE=cyclone ./run
ff3a8bf8 987# foment
6c0968a6 988scheme_MODE=foment ./run
ff3a8bf8
VS
989```
990
034e82ad
DM
991### Skew ###
992
034e82ad
DM
993The Skew implementation of mal has been tested with Skew 0.7.42.
994
995```
996cd skew
997make
998node stepX_YYY.js
999```
1000
1001
2539e6af
KR
1002### Swift
1003
e31349f6
KR
1004The Swift implementation of mal requires the Swift 2.0 compiler (XCode
10057.0) to build. Older versions will not work due to changes in the
1006language and standard library.
8b142f08 1007
2539e6af
KR
1008```
1009cd swift
1010make
1011./stepX_YYY
1012```
1013
ea1395aa
JM
1014### Swift 3
1015
1016The Swift 3 implementation of mal requires the Swift 3.0 compiler. It
a3a6f680 1017has been tested with Swift 3 Preview 3.
ea1395aa
JM
1018
1019```
1020cd swift3
1021make
1022./stepX_YYY
1023```
1024
2c1c2660 1025### Swift 4
1026
1027The Swift 4 implementation of mal requires the Swift 4.0 compiler. It
1028has been tested with Swift 4.2.3 release.
1029
1030```
1031cd swift4
1032make
1033./stepX_YYY
1034```
1035
6aa9c258
OM
1036### Swift 5
1037
1038The Swift 5 implementation of mal requires the Swift 5.0 compiler. It
1039has been tested with Swift 5.1.1 release.
1040
1041```
1042cd swift5
b667adf5 1043swift run stepX_YYY
6aa9c258
OM
1044```
1045
54d9903c
DM
1046### Tcl 8.6
1047
54d9903c
DM
1048The Tcl implementation of mal requires Tcl 8.6 to run. For readline line
1049editing support, install tclreadline.
1050
1051```
1052cd tcl
1053tclsh ./stepX_YYY.tcl
1054```
1055
c527d565 1056### TypeScript
1057
1058The TypeScript implementation of mal requires the TypeScript 2.2 compiler.
db885df9 1059It has been tested with Node.js v6.
c527d565 1060
1061```
1062cd ts
1063make
1064node ./stepX_YYY.js
1065```
1066
213a3288
ST
1067### Vala
1068
1069The Vala implementation of mal has been tested with the Vala 0.40.8
1070compiler. You will need to install `valac` and `libreadline-dev` or
1071equivalent.
1072
1073```
1074cd vala
1075make
1076./stepX_YYY
1077```
1078
36e91db4
DM
1079### VHDL
1080
36e91db4
DM
1081The VHDL implementation of mal has been tested with GHDL 0.29.
1082
1083```
1084cd vhdl
1085make
1086./run_vhdl.sh ./stepX_YYY
1087```
1088
50a964ce
DM
1089### Vimscript
1090
aa62cbda 1091The Vimscript implementation of mal requires Vim 8.0 to run.
50a964ce
DM
1092
1093```
1094cd vimscript
1095./run_vimscript.sh ./stepX_YYY.vim
1096```
1097
ee7cd585
JM
1098### Visual Basic.NET ###
1099
1100The VB.NET implementation of mal has been tested on Linux using the Mono
1101VB compiler (vbnc) and the Mono runtime (version 2.10.8.1). Both are
1102required to build and run the VB.NET implementation.
1103
1104```
1105cd vb
1106make
1107mono ./stepX_YYY.exe
1108```
1109
d72395aa
JM
1110### WebAssembly (wasm) ###
1111
27359631 1112The WebAssembly implementation is written in
d72395aa 1113[Wam](https://github.com/kanaka/wam) (WebAssembly Macro language) and
d88adace 1114runs under several different non-web embeddings (runtimes):
9a7485aa 1115[node](https://nodejs.org),
d88adace 1116[wasmtime](https://github.com/CraneStation/wasmtime),
9a7485aa
JM
1117[wasmer](https://wasmer.io),
1118[lucet](https://github.com/fastly/lucet),
030f725c 1119[wax](https://github.com/kanaka/wac),
d88adace
JM
1120[wace](https://github.com/kanaka/wac),
1121[warpy](https://github.com/kanaka/warpy).
d72395aa
JM
1122
1123```
1124cd wasm
d88adace
JM
1125# node
1126make wasm_MODE=node
1127./run.js ./stepX_YYY.wasm
1128# wasmtime
1129make wasm_MODE=wasmtime
1130wasmtime --dir=./ --dir=../ --dir=/ ./stepX_YYY.wasm
9a7485aa
JM
1131# wasmer
1132make wasm_MODE=wasmer
1133wasmer run --dir=./ --dir=../ --dir=/ ./stepX_YYY.wasm
1134# lucet
1135make wasm_MODE=lucet
1136lucet-wasi --dir=./:./ --dir=../:../ --dir=/:/ ./stepX_YYY.so
030f725c
JM
1137# wax
1138make wasm_MODE=wax
9a7485aa 1139wax ./stepX_YYY.wasm
d88adace
JM
1140# wace
1141make wasm_MODE=wace_libc
d72395aa 1142wace ./stepX_YYY.wasm
d88adace
JM
1143# warpy
1144make wasm_MODE=warpy
1145warpy --argv --memory-pages 256 ./stepX_YYY.wasm
d72395aa
JM
1146```
1147
84eaa11c
DM
1148### Wren
1149
1150The Wren implementation of mal was tested on Wren 0.2.0.
1151
1152```
1153cd wren
1154wren ./stepX_YYY.wren
1155```
1156
a3665311
DM
1157### Yorick
1158
a3665311
DM
1159The Yorick implementation of mal was tested on Yorick 2.2.04.
1160
1161```
1162cd yorick
1163yorick -batch ./stepX_YYY.i
1164```
97a8edea
JT
1165
1166### Zig
1167
1168The Zig implementation of mal was tested on Zig 0.5.
1169
1170```
1171cd zig
1172zig build stepX_YYY
1173```
a3665311 1174
ee7cd585
JM
1175
1176
592eb5cf
JM
1177## Running tests
1178
d57f74df
JM
1179The top level Makefile has a number of useful targets to assist with
1180implementation development and testing. The `help` target provides
1181a list of the targets and options:
1182
1183```
1184make help
1185```
1186
294aba2c
JM
1187### Functional tests
1188
9a7485aa 1189The are almost 800 generic functional tests (for all implementations)
294aba2c
JM
1190in the `tests/` directory. Each step has a corresponding test file
1191containing tests specific to that step. The `runtest.py` test harness
bd62ff74
JM
1192launches a Mal step implementation and then feeds the tests one at
1193a time to the implementation and compares the output/return value to
1194the expected output/return value.
592eb5cf 1195
592eb5cf
JM
1196* To run all the tests across all implementations (be prepared to wait):
1197
1198```
1199make test
1200```
1201
1202* To run all tests against a single implementation:
1203
1204```
e5737b08 1205make "test^IMPL"
592eb5cf
JM
1206
1207# e.g.
e5737b08
SL
1208make "test^clojure"
1209make "test^js"
592eb5cf
JM
1210```
1211
1212* To run tests for a single step against all implementations:
1213
1214```
e5737b08 1215make "test^stepX"
592eb5cf
JM
1216
1217# e.g.
e5737b08
SL
1218make "test^step2"
1219make "test^step7"
592eb5cf
JM
1220```
1221
4c58cd4e 1222* To run tests for a specific step against a single implementation:
592eb5cf
JM
1223
1224```
e5737b08 1225make "test^IMPL^stepX"
592eb5cf
JM
1226
1227# e.g
e5737b08
SL
1228make "test^ruby^step3"
1229make "test^ps^step4"
592eb5cf 1230```
fd888612 1231
294aba2c
JM
1232### Self-hosted functional tests
1233
1234* To run the functional tests in self-hosted mode, you specify `mal`
1235 as the test implementation and use the `MAL_IMPL` make variable
1236 to change the underlying host language (default is JavaScript):
1237```
e5737b08 1238make MAL_IMPL=IMPL "test^mal^step2"
294aba2c
JM
1239
1240# e.g.
e5737b08
SL
1241make "test^mal^step2" # js is default
1242make MAL_IMPL=ruby "test^mal^step2"
1243make MAL_IMPL=python "test^mal^step2"
294aba2c
JM
1244```
1245
854cf2a6
DM
1246### Starting the REPL
1247
1248* To start the REPL of an implementation in a specific step:
1249
1250```
1251make "repl^IMPL^stepX"
1252
1253# e.g
1254make "repl^ruby^step3"
1255make "repl^ps^step4"
1256```
1257
1258* If you omit the step, then `stepA` is used:
1259
1260```
1261make "repl^IMPL"
1262
1263# e.g
1264make "repl^ruby"
1265make "repl^ps"
1266```
1267
1268* To start the REPL of the self-hosted implementation, specify `mal` as the
1269 REPL implementation and use the `MAL_IMPL` make variable to change the
1270 underlying host language (default is JavaScript):
1271```
1272make MAL_IMPL=IMPL "repl^mal^stepX"
1273
1274# e.g.
1275make "repl^mal^step2" # js is default
1276make MAL_IMPL=ruby "repl^mal^step2"
1277make MAL_IMPL=python "repl^mal"
1278```
294aba2c
JM
1279
1280### Performance tests
1281
8569b2af
JM
1282Warning: These performance tests are neither statistically valid nor
1283comprehensive; runtime performance is a not a primary goal of mal. If
1284you draw any serious conclusions from these performance tests, then
1285please contact me about some amazing oceanfront property in Kansas
1286that I'm willing to sell you for cheap.
1287
294aba2c
JM
1288* To run performance tests against a single implementation:
1289```
e5737b08 1290make "perf^IMPL"
294aba2c
JM
1291
1292# e.g.
e5737b08 1293make "perf^js"
294aba2c
JM
1294```
1295
1296* To run performance tests against all implementations:
1297```
e5737b08 1298make "perf"
294aba2c
JM
1299```
1300
1301### Generating language statistics
1302
4c58cd4e 1303* To report line and byte statistics for a single implementation:
294aba2c 1304```
e5737b08 1305make "stats^IMPL"
294aba2c
JM
1306
1307# e.g.
e5737b08 1308make "stats^js"
294aba2c
JM
1309```
1310
5b207de7 1311## Dockerized testing
75363567 1312
5b207de7
JM
1313Every implementation directory contains a Dockerfile to create
1314a docker image containing all the dependencies for that
1315implementation. In addition, the top-level Makefile contains support
1316for running the tests target (and perf, stats, repl, etc) within
1317a docker container for that implementation by passing *"DOCKERIZE=1"*
1318on the make command line. For example:
75363567 1319
75363567 1320```
5b207de7 1321make DOCKERIZE=1 "test^js^step3"
75363567
JM
1322```
1323
5b207de7
JM
1324Existing implementations already have docker images built and pushed
1325to the docker registry. However, if
1326you wish to build or rebuild a docker image locally, the toplevel
1327Makefile provides a rule for building docker images:
1328
75363567 1329```
5b207de7
JM
1330make "docker-build^IMPL"
1331```
1332
75363567
JM
1333
1334**Notes**:
5b207de7
JM
1335* Docker images are named *"kanaka/mal-test-IMPL"*
1336* JVM-based language implementations (Groovy, Java, Clojure, Scala):
70cefa38
RM
1337 you will probably need to run this command once manually
1338 first `make DOCKERIZE=1 "repl^IMPL"` before you can run tests because
5b207de7 1339 runtime dependencies need to be downloaded to avoid the tests timing
70cefa38 1340 out. These dependencies are downloaded to dot-files in the /mal
5b207de7 1341 directory so they will persist between runs.
75363567 1342
07734c09 1343
fd888612
JM
1344## License
1345
1346Mal (make-a-lisp) is licensed under the MPL 2.0 (Mozilla Public
1347License 2.0). See LICENSE.txt for more details.