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