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