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