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