Merge pull request #184 from dubek/mal-time-ms
[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
61f69fba 9Mal is implemented in 49 languages:
bcddc3e4 10
8c7587af 11* GNU awk
edc3b064 12* Bash shell
bcddc3e4 13* C
73fc9366 14* C++
edc3b064
JM
15* C#
16* Clojure
891c3f3b 17* CoffeeScript
6c4dede1 18* Crystal
f82cb965 19* D
bb526975 20* Elixir
e0b7f668 21* Emacs Lisp
2cc3804b 22* Erlang
88e934b6 23* ES6 (ECMAScript 6 / ECMAScript 2015)
6f78381f 24* F#
0fe47e88 25* Factor
96032890 26* Forth
1771ab50 27* Go
7ab0f63e 28* Groovy
7c6882f2 29* GNU Guile
b76aa73b 30* Haskell
33dec7af 31* Haxe
61f69fba 32* Io
bcddc3e4 33* Java
39381792
JM
34* JavaScript ([Online Demo](http://kanaka.github.io/mal))
35* Julia
53c2ea70 36* Kotlin
9d42904e 37* Lua
bcddc3e4
JM
38* GNU Make
39* mal itself
8a9d0a8a 40* MATLAB
1218ce98 41* [miniMAL](https://github.com/kanaka/miniMAL)
a2cd0a3a 42* Nim
7cae6e6f 43* Objective C
bc6448bc 44* OCaml
6301e0b6 45* Perl
edc3b064
JM
46* PHP
47* Postscript
48* Python
23e38cd2 49* RPython
9b3362e8 50* R
f5223195 51* Racket
8adb0827 52* Ruby
abdd56eb 53* Rust
821930db 54* Scala
8b142f08 55* Swift
ea1395aa 56* Swift 3
54d9903c 57* Tcl
50a964ce 58* Vimscript
ee7cd585 59* Visual Basic.NET
bcddc3e4
JM
60
61
bd08422d
JM
62Mal is a learning tool. See the [make-a-lisp process
63guide](process/guide.md). Each implementation of mal is separated into
6411 incremental, self-contained (and testable) steps that demonstrate
65core concepts of Lisp. The last step is capable of self-hosting
66(running the mal implementation of mal).
bcddc3e4
JM
67
68The mal (make a lisp) steps are:
69
0f4ca9d1
JM
70* [step0_repl](process/guide.md#step0)
71* [step1_read_print](process/guide.md#step1)
72* [step2_eval](process/guide.md#step2)
73* [step3_env](process/guide.md#step3)
74* [step4_if_fn_do](process/guide.md#step4)
75* [step5_tco](process/guide.md#step5)
76* [step6_file](process/guide.md#step6)
77* [step7_quote](process/guide.md#step7)
78* [step8_macros](process/guide.md#step8)
79* [step9_try](process/guide.md#step9)
90f618cb 80* [stepA_mal](process/guide.md#stepA)
bcddc3e4
JM
81
82
83Mal was presented publicly for the first time in a lightning talk at
84Clojure West 2014 (unfortunately there is no video). See
85mal/clojurewest2014.mal for the presentation that was given at the
86conference (yes the presentation is a mal program).
60154d24 87
144f2b6a 88If you are interesting in creating a mal implementation (or just
bd62ff74 89interested in using mal for something), please drop by the #mal
144f2b6a
JM
90channel on freenode. In addition to the [make-a-lisp process
91guide](process/guide.md) there is also a [mal/make-a-lisp
92FAQ](docs/FAQ.md) where I attempt to answer some common questions.
93
60154d24
JM
94## Building/running implementations
95
5b207de7
JM
96The simplest way to run any given implementation is to use docker.
97Every implementation has a docker image pre-built with language
98dependencies installed. You can launch the REPL using a convenience
99target in the top level Makefile (where IMPL is the implementation
100directory name and stepX is the step to run):
101
102```
103make DOCKERIZE=1 "repl^IMPL^stepX"
104 # OR stepA is the default step:
105make DOCKERIZE=1 "repl^IMPL"
106```
107
108
8c7587af
MK
109### GNU awk
110
4c58cd4e 111*The GNU awk implementation was created by [Miutsuru kariya](https://github.com/kariya-mitsuru)*
390d5829 112
8c7587af
MK
113The GNU awk implementation of mal has been tested with GNU awk 4.1.1.
114
115```
116cd gawk
117gawk -O -f stepX_YYY.awk
118```
119
bcddc3e4 120### Bash 4
60154d24
JM
121
122```
123cd bash
124bash stepX_YYY.sh
125```
126
bcddc3e4 127### C
60154d24 128
01c97316
JM
129The C implementation of mal requires the following libraries (lib and
130header packages): glib, libffi6 and either the libedit or GNU readline library.
54c75382 131
60154d24
JM
132```
133cd c
134make
135./stepX_YYY
136```
137
73fc9366
JM
138### C++
139
a848d783
JM
140*The C++ implementation was created by [Stephen Thirlwall (sdt)](https://github.com/sdt)*
141
73fc9366
JM
142The C++ implementation of mal requires g++-4.9 or clang++-3.5 and
143a readline compatible library to build. See the `cpp/README.md` for
144more details:
145
146```
147cd cpp
148make
149 # OR
150make CXX=clang++-3.5
151./stepX_YYY
152```
153
154
9b1563a3 155### C# ###
edc3b064
JM
156
157The C# implementation of mal has been tested on Linux using the Mono
158C# compiler (mcs) and the Mono runtime (version 2.10.8.1). Both are
159required to build and run the C# implementation.
160
161```
162cd cs
163make
ee7cd585 164mono ./stepX_YYY.exe
edc3b064
JM
165```
166
167
bcddc3e4 168### Clojure
60154d24 169
aa716df6
JM
170For the most part the Clojure implementation requires Clojure 1.5,
171however, to pass all tests, Clojure 1.8.0-RC4 is required.
172
60154d24
JM
173```
174cd clojure
175lein with-profile +stepX trampoline run
176```
177
891c3f3b
JM
178### CoffeeScript
179
180```
181sudo npm install -g coffee-script
182cd coffee
183coffee ./stepX_YYY
184```
185
58b84dd5 186### Crystal
187
6427adea 188*The Crystal implementation of mal was created by [Linda_pp](https://github.com/rhysd)*
6c4dede1 189
d3ce5b49 190The Crystal implementation of mal has been tested with Crystal 0.10.0.
6c4dede1 191
58b84dd5 192```
193cd crystal
194crystal run ./stepX_YYY.cr
6c4dede1
JM
195 # OR
196make # needed to run tests
197./stepX_YYY
58b84dd5 198```
199
f82cb965
DM
200### D
201
202*The D implementation was created by [Dov Murik](https://github.com/dubek)*
203
204The D implementation of mal was tested with GDC 4.8. It requires the GNU
205readline library.
206
207```
208cd d
209make
210./stepX_YYY
211```
212
e0b7f668
VS
213### Emacs Lisp
214
215*The Emacs Lisp implementation was created by [Vasilij Schneidermann](https://github.com/wasamasa)*
216
217The Emacs Lisp implementation of mal has been tested with Emacs 24.3
218and 24.5. While there is very basic readline editing (`<backspace>`
219and `C-d` work, `C-c` cancels the process), it is recommended to use
220`rlwrap`.
221
222```
223cd elisp
224emacs -Q --batch --load stepX_YYY.el
225# with full readline support
226rlwrap emacs -Q --batch --load stepX_YYY.el
227```
228
bb526975 229### Elixir
230
231*The Elixir implementation was created by [Martin Ek (ekmartin)](https://github.com/ekmartin)*
232
233The Elixir implementation of mal has been tested with Elixir 1.0.5.
234
235```
236cd elixir
df2ca97b 237mix stepX_YYY
238# Or with readline/line editing functionality:
bb526975 239iex -S mix stepX_YYY
240```
241
2cc3804b
NF
242### Erlang
243
425ef3d7
JM
244*The Erlang implementation was created by [Nathan Fiedler (nlfiedler)](https://github.com/nlfiedler)*
245
82484631
JM
246The Erlang implementation of mal requires [Erlang/OTP R17](http://www.erlang.org/download.html)
247and [rebar](https://github.com/rebar/rebar) to build.
2cc3804b
NF
248
249```
250cd erlang
425ef3d7
JM
251make
252 # OR
253MAL_STEP=stepX_YYY rebar compile escriptize # build individual step
2cc3804b
NF
254./stepX_YYY
255```
256
88e934b6
JM
257### ES6 (ECMAScript 6 / ECMAScript 2015)
258
259The ES6 implementation uses the [babel](https://babeljs.io) compiler
260to generate ES5 compatible JavaScript. The generated code has been
261tested with Node 0.12.4.
262
263```
264cd es6
265make
266node build/stepX_YYY.js
267```
268
269
6f78381f
PS
270### F# ###
271
272*The F# implementation was created by [Peter Stephens (pstephens)](https://github.com/pstephens)*
273
274The F# implementation of mal has been tested on Linux using the Mono
275F# compiler (fsharpc) and the Mono runtime (version 3.12.1). The mono C#
206a1657 276compiler (mcs) is also necessary to compile the readline dependency. All are
6f78381f
PS
277required to build and run the F# implementation.
278
279```
280cd fsharp
281make
282mono ./stepX_YYY.exe
283```
284
5a53c643
JL
285### Factor
286
44c8a524 287*The Factor implementation was created by [Jordan Lewis (jordanlewis)](https://github.com/jordanlewis)*
5a53c643 288
0fe47e88
JM
289The Factor implementation of mal has been tested with Factor 0.97
290([factorcode.org](factorcode.org)).
291
5a53c643
JL
292```
293cd factor
199b1ce7 294FACTOR_ROOTS=. factor -run=stepX_YYY
5a53c643
JL
295```
296
96032890
C
297### Forth
298
a848d783
JM
299*The Forth implementation was created by [Chris Houser (chouser)](https://github.com/chouser)*
300
96032890
C
301```
302cd forth
303gforth stepX_YYY.fs
304```
305
1771ab50
JM
306### Go
307
0fe47e88 308The Go implementation of mal requires that go is installed on on the
fd888612
JM
309path. The implementation has been tested with Go 1.3.1.
310
1771ab50
JM
311```
312cd go
313make
314./stepX_YYY
315```
316
317
7ab0f63e
JM
318### Groovy
319
320The Groovy implementation of mal requires Groovy to run and has been
321tested with Groovy 1.8.6.
322
323```
324cd groovy
325make
326groovy ./stepX_YYY.groovy
327```
328
5a9cda80
JM
329### GNU Guile 2.1+
330
331*The Guile implementation was created by [Mu Lei (NalaGinrut)](https://github.com/NalaGinrut).*
332
333```
334cd guile
335guile -L ./ stepX_YYY.scm
336```
7ab0f63e 337
b76aa73b
JM
338### Haskell
339
2988d38e 340Install the Haskell compiler (ghc/ghci), the Haskell platform and
5400d4bf
JM
341either the editline package (BSD) or the readline package (GPL). On
342Ubuntu these packages are: ghc, haskell-platform,
343libghc-readline-dev/libghc-editline-dev
b76aa73b
JM
344
345```
346cd haskell
347make
348./stepX_YYY
349```
350
33dec7af
JM
351### Haxe
352
353The Haxe implementation of mal requires Haxe version 3.2 to compile.
354Four different Haxe targets are supported: Neko, Python, C++, and
355JavaScript.
356
357```
358cd haxe
359# Neko
360make all-neko
361neko ./stepX_YYY.n
362# Python
363make all-python
364python3 ./stepX_YYY.py
365# C++
366make all-cpp
367./cpp/stepX_YYY
368# JavaScript
369make all-js
370node ./stepX_YYY.js
371```
372
61f69fba
DM
373### Io
374
375*The Io implementation was created by [Dov Murik](https://github.com/dubek)*
376
377The Io implementation of mal has been tested with Io version 20110905.
378
379```
380cd io
381io ./stepX_YYY.io
382```
b76aa73b 383
bcddc3e4 384### Java 1.7
60154d24 385
01c97316
JM
386The Java implementation of mal requires maven2 to build.
387
60154d24
JM
388```
389cd java
390mvn compile
391mvn -quiet exec:java -Dexec.mainClass=mal.stepX_YYY
392 # OR
393mvn -quiet exec:java -Dexec.mainClass=mal.stepX_YYY -Dexec.args="CMDLINE_ARGS"
394```
395
39381792 396### JavaScript/Node
60154d24
JM
397
398```
399cd js
54c75382 400npm update
60154d24
JM
401node stepX_YYY.js
402```
403
39381792
JM
404### Julia
405
82484631 406The Julia implementation of mal requires Julia 0.4.
39381792
JM
407
408```
409cd julia
410julia stepX_YYY.jl
411```
412
53c2ea70
JFI
413### Kotlin
414
415*The Kotlin implementation was created by [Javier Fernandez-Ivern](https://github.com/ivern)*
416
75787d77 417The Kotlin implementation of mal has been tested with Kotlin 1.0.
53c2ea70
JFI
418
419```
420cd kotlin
421make
422java -jar stepX_YYY.jar
423```
424
9d42904e
JM
425### Lua
426
8a9d0a8a 427Running the Lua implementation of mal requires lua 5.1 or later,
9d42904e
JM
428luarocks and the lua-rex-pcre library installed.
429
430```
431cd lua
432make # to build and link linenoise.so
433./stepX_YYY.lua
434```
435
bcddc3e4 436### Mal
60154d24
JM
437
438Running the mal implementation of mal involves running stepA of one of
439the other implementations and passing the mal step to run as a command
5d446bd8 440line argument.
60154d24
JM
441
442```
443cd IMPL
444IMPL_STEPA_CMD ../mal/stepX_YYY.mal
445
446```
447
bcddc3e4 448### GNU Make 3.81
60154d24
JM
449
450```
451cd make
452make -f stepX_YYY.mk
453```
454
de69b639 455### Nim 0.11.0
a2cd0a3a 456
a848d783
JM
457*The Nim implementation was created by [Dennis Felsing (def-)](https://github.com/def-)*
458
de69b639 459Running the Nim implementation of mal requires Nim 0.11.0 or later.
a2cd0a3a 460
461```
462cd nim
463make
464 # OR
465nimble build
466./stepX_YYY
467```
468
7cae6e6f
JM
469### Objective C
470
471The Objective C implementation of mal has been built and tested on
2faae94c
JM
472Linux using clang/LLVM 3.6. It has also been built and tested on OS
473X using XCode 7.
7cae6e6f
JM
474
475```
476cd objc
477make
478./stepX_YYY
479```
480
bc6448bc
C
481### OCaml 4.01.0
482
a848d783
JM
483*The OCaml implementation was created by [Chris Houser (chouser)](https://github.com/chouser)*
484
bc6448bc
C
485```
486cd ocaml
487make
488./stepX_YYY
489```
490
8a9d0a8a
JM
491### MATLAB
492
493The MATLAB implementation of mal has been tested with MATLAB version
494R2014a on Linux. Note that MATLAB is a commercial product. It should
495be fairly simple to support GNU Octave once it support classdef object
496syntax.
497
498```
499cd matlab
500./stepX_YYY
501matlab -nodisplay -nosplash -nodesktop -nojvm -r "stepX_YYY();quit;"
502 # OR with command line arguments
503matlab -nodisplay -nosplash -nodesktop -nojvm -r "stepX_YYY('arg1','arg2');quit;"
504```
505
1218ce98
JM
506### miniMAL
507
508[miniMAL](https://github.com/kanaka/miniMAL) is small Lisp interpreter
509implemented in less than 1024 bytes of JavaScript. To run the miniMAL
510implementation of mal you need to download/install the miniMAL
511interpreter (which requires Node.js).
512```
1218ce98 513cd miniMAL
478fd9ce
JM
514# Download miniMAL and dependencies
515npm install
516export PATH=`pwd`/node_modules/minimal-lisp/:$PATH
517# Now run mal implementation in miniMAL
1218ce98
JM
518miniMAL ./stepX_YYY
519```
520
9b1563a3 521### Perl 5.8
9e5b2151
JM
522
523For readline line editing support, install Term::ReadLine::Perl or
524Term::ReadLine::Gnu from CPAN.
525
526```
527cd perl
528perl stepX_YYY.pl
529```
530
531
bcddc3e4 532### PHP 5.3
60154d24 533
01c97316
JM
534The PHP implementation of mal requires the php command line interface
535to run.
536
60154d24
JM
537```
538cd php
539php stepX_YYY.php
540```
541
bcddc3e4 542### Postscript Level 2/3
60154d24 543
01c97316
JM
544The Postscript implementation of mal requires ghostscript to run. It
545has been tested with ghostscript 9.10.
546
60154d24
JM
547```
548cd ps
fa64b741 549gs -q -dNODISPLAY -I./ stepX_YYY.ps
60154d24
JM
550```
551
23e38cd2 552### Python (2.X or 3.X)
60154d24
JM
553
554```
555cd python
556python stepX_YYY.py
557```
8adb0827 558
23e38cd2
JM
559### RPython
560
561You must have [rpython](https://rpython.readthedocs.org/) on your path
562(included with [pypy](https://bitbucket.org/pypy/pypy/)).
563
564```
565cd rpython
4e8d7c28 566make # this takes a very long time
23e38cd2
JM
567./stepX_YYY
568```
569
9b3362e8
JM
570### R
571
572The R implementation of mal requires R (r-base-core) to run.
573
574```
575cd r
9d42904e 576make libs # to download and build rdyncall
f5223195
JM
577Rscript stepX_YYY.r
578```
579
580### Racket (5.3)
581
582The Racket implementation of mal requires the Racket
583compiler/interpreter to run.
584
585```
586cd racket
3796240a 587./stepX_YYY.rkt
9b3362e8
JM
588```
589
107d9694 590### Ruby (1.9+)
8adb0827
JM
591
592```
593cd ruby
594ruby stepX_YYY.rb
595```
592eb5cf 596
9106a221 597### Rust (1.0.0 nightly)
abdd56eb
JM
598
599The rust implementation of mal requires the rust compiler and build
600tool (cargo) to build.
601
602```
603cd rust
bbeb1b87 604cargo run --release --bin stepX_YYY
abdd56eb
JM
605```
606
821930db
JM
607### Scala ###
608
609Install scala and sbt (http://www.scala-sbt.org/0.13/tutorial/Installing-sbt-on-Linux.html):
610
611```
612cd scala
613sbt 'run-main stepX_YYY'
614 # OR
615sbt compile
616scala -classpath target/scala*/classes stepX_YYY
617```
618
2539e6af
KR
619### Swift
620
a848d783
JM
621*The Swift implementation was created by [Keith Rollin](https://github.com/keith-rollin)*
622
e31349f6
KR
623The Swift implementation of mal requires the Swift 2.0 compiler (XCode
6247.0) to build. Older versions will not work due to changes in the
625language and standard library.
8b142f08 626
2539e6af
KR
627```
628cd swift
629make
630./stepX_YYY
631```
632
ea1395aa
JM
633### Swift 3
634
635The Swift 3 implementation of mal requires the Swift 3.0 compiler. It
636has been tested with the development version of the Swift 3 from
6372016-02-08.
638
639```
640cd swift3
641make
642./stepX_YYY
643```
644
54d9903c
DM
645### Tcl 8.6
646
647*The Tcl implementation was created by [Dov Murik](https://github.com/dubek)*
648
649The Tcl implementation of mal requires Tcl 8.6 to run. For readline line
650editing support, install tclreadline.
651
652```
653cd tcl
654tclsh ./stepX_YYY.tcl
655```
656
50a964ce
DM
657### Vimscript
658
659*The Vimscript implementation was created by [Dov Murik](https://github.com/dubek)*
660
661The Vimscript implementation of mal requires Vim to run. It has been tested
662with Vim 7.4.
663
664```
665cd vimscript
666./run_vimscript.sh ./stepX_YYY.vim
667```
668
ee7cd585
JM
669### Visual Basic.NET ###
670
671The VB.NET implementation of mal has been tested on Linux using the Mono
672VB compiler (vbnc) and the Mono runtime (version 2.10.8.1). Both are
673required to build and run the VB.NET implementation.
674
675```
676cd vb
677make
678mono ./stepX_YYY.exe
679```
680
681
682
592eb5cf
JM
683## Running tests
684
294aba2c
JM
685### Functional tests
686
687The are nearly 500 generic functional tests (for all implementations)
688in the `tests/` directory. Each step has a corresponding test file
689containing tests specific to that step. The `runtest.py` test harness
bd62ff74
JM
690launches a Mal step implementation and then feeds the tests one at
691a time to the implementation and compares the output/return value to
692the expected output/return value.
592eb5cf
JM
693
694To simplify the process of running tests, a top level Makefile is
695provided with convenient test targets.
696
697* To run all the tests across all implementations (be prepared to wait):
698
699```
700make test
701```
702
703* To run all tests against a single implementation:
704
705```
e5737b08 706make "test^IMPL"
592eb5cf
JM
707
708# e.g.
e5737b08
SL
709make "test^clojure"
710make "test^js"
592eb5cf
JM
711```
712
713* To run tests for a single step against all implementations:
714
715```
e5737b08 716make "test^stepX"
592eb5cf
JM
717
718# e.g.
e5737b08
SL
719make "test^step2"
720make "test^step7"
592eb5cf
JM
721```
722
4c58cd4e 723* To run tests for a specific step against a single implementation:
592eb5cf
JM
724
725```
e5737b08 726make "test^IMPL^stepX"
592eb5cf
JM
727
728# e.g
e5737b08
SL
729make "test^ruby^step3"
730make "test^ps^step4"
592eb5cf 731```
fd888612 732
294aba2c
JM
733### Self-hosted functional tests
734
735* To run the functional tests in self-hosted mode, you specify `mal`
736 as the test implementation and use the `MAL_IMPL` make variable
737 to change the underlying host language (default is JavaScript):
738```
e5737b08 739make MAL_IMPL=IMPL "test^mal^step2"
294aba2c
JM
740
741# e.g.
e5737b08
SL
742make "test^mal^step2" # js is default
743make MAL_IMPL=ruby "test^mal^step2"
744make MAL_IMPL=python "test^mal^step2"
294aba2c
JM
745```
746
854cf2a6
DM
747### Starting the REPL
748
749* To start the REPL of an implementation in a specific step:
750
751```
752make "repl^IMPL^stepX"
753
754# e.g
755make "repl^ruby^step3"
756make "repl^ps^step4"
757```
758
759* If you omit the step, then `stepA` is used:
760
761```
762make "repl^IMPL"
763
764# e.g
765make "repl^ruby"
766make "repl^ps"
767```
768
769* To start the REPL of the self-hosted implementation, specify `mal` as the
770 REPL implementation and use the `MAL_IMPL` make variable to change the
771 underlying host language (default is JavaScript):
772```
773make MAL_IMPL=IMPL "repl^mal^stepX"
774
775# e.g.
776make "repl^mal^step2" # js is default
777make MAL_IMPL=ruby "repl^mal^step2"
778make MAL_IMPL=python "repl^mal"
779```
294aba2c
JM
780
781### Performance tests
782
8569b2af
JM
783Warning: These performance tests are neither statistically valid nor
784comprehensive; runtime performance is a not a primary goal of mal. If
785you draw any serious conclusions from these performance tests, then
786please contact me about some amazing oceanfront property in Kansas
787that I'm willing to sell you for cheap.
788
294aba2c
JM
789* To run performance tests against a single implementation:
790```
e5737b08 791make "perf^IMPL"
294aba2c
JM
792
793# e.g.
e5737b08 794make "perf^js"
294aba2c
JM
795```
796
797* To run performance tests against all implementations:
798```
e5737b08 799make "perf"
294aba2c
JM
800```
801
802### Generating language statistics
803
4c58cd4e 804* To report line and byte statistics for a single implementation:
294aba2c 805```
e5737b08 806make "stats^IMPL"
294aba2c
JM
807
808# e.g.
e5737b08 809make "stats^js"
294aba2c
JM
810```
811
4c58cd4e 812* To report line and bytes statistics for general Lisp code (env, core
294aba2c
JM
813 and stepA):
814```
e5737b08 815make "stats-lisp^IMPL"
294aba2c
JM
816
817# e.g.
e5737b08 818make "stats-lisp^js"
294aba2c
JM
819```
820
5b207de7 821## Dockerized testing
75363567 822
5b207de7
JM
823Every implementation directory contains a Dockerfile to create
824a docker image containing all the dependencies for that
825implementation. In addition, the top-level Makefile contains support
826for running the tests target (and perf, stats, repl, etc) within
827a docker container for that implementation by passing *"DOCKERIZE=1"*
828on the make command line. For example:
75363567 829
75363567 830```
5b207de7 831make DOCKERIZE=1 "test^js^step3"
75363567
JM
832```
833
5b207de7
JM
834Existing implementations already have docker images built and pushed
835to the docker registry. However, if
836you wish to build or rebuild a docker image locally, the toplevel
837Makefile provides a rule for building docker images:
838
75363567 839```
5b207de7
JM
840make "docker-build^IMPL"
841```
842
75363567
JM
843
844**Notes**:
5b207de7
JM
845* Docker images are named *"kanaka/mal-test-IMPL"*
846* JVM-based language implementations (Groovy, Java, Clojure, Scala):
847 you will probably need to run these implementations once manually
848 first (make DOCKERIZE=1 "repl^IMPL")before you can run tests because
849 runtime dependencies need to be downloaded to avoid the tests timing
850 out. These dependencies are download to dot-files in the /mal
851 directory so they will persist between runs.
75363567 852
294aba2c 853
fd888612
JM
854## License
855
856Mal (make-a-lisp) is licensed under the MPL 2.0 (Mozilla Public
857License 2.0). See LICENSE.txt for more details.