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