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