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