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