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