1
1
mirror of https://github.com/kanaka/mal.git synced 2024-09-20 10:07:45 +03:00
mal - Make a Lisp
Go to file
2014-04-20 21:50:52 -05:00
bash All: *ARGV* and *host-language*. Misc syncing/fixes. 2014-04-19 13:04:09 -05:00
c All: *ARGV* and *host-language*. Misc syncing/fixes. 2014-04-19 13:04:09 -05:00
clojure All: *ARGV* and *host-language*. Misc syncing/fixes. 2014-04-19 13:04:09 -05:00
cs All: *ARGV* and *host-language*. Misc syncing/fixes. 2014-04-19 13:04:09 -05:00
docs Perl: add step2_eval. 2014-04-20 21:50:52 -05:00
java All: *ARGV* and *host-language*. Misc syncing/fixes. 2014-04-19 13:04:09 -05:00
js All: *ARGV* and *host-language*. Misc syncing/fixes. 2014-04-19 13:04:09 -05:00
make All: *ARGV* and *host-language*. Misc syncing/fixes. 2014-04-19 13:04:09 -05:00
mal All: *ARGV* and *host-language*. Misc syncing/fixes. 2014-04-19 13:04:09 -05:00
perl Perl: add step2_eval. 2014-04-20 21:50:52 -05:00
php All: *ARGV* and *host-language*. Misc syncing/fixes. 2014-04-19 13:04:09 -05:00
ps All: *ARGV* and *host-language*. Misc syncing/fixes. 2014-04-19 13:04:09 -05:00
python All: *ARGV* and *host-language*. Misc syncing/fixes. 2014-04-19 13:04:09 -05:00
ruby All: *ARGV* and *host-language*. Misc syncing/fixes. 2014-04-19 13:04:09 -05:00
tests Tests: move optional features to end and print header. 2014-04-19 15:27:19 -05:00
.gitignore All: perf test, Makefile refactor, add *host-language* 2014-04-17 21:49:07 -05:00
.gitmodules JS: fix josh.js submodule for gh-pages compatibility. 2014-04-06 17:06:07 -05:00
core.mal All: perf test, Makefile refactor, add *host-language* 2014-04-17 21:49:07 -05:00
Makefile Perl: add step1_read_print, types. 2014-04-19 15:12:13 -05:00
mal.html JS: fix web interface. 2014-04-06 16:40:55 -05:00
README.md Perl: add readline interface and step0_repl 2014-04-19 13:57:00 -05:00
runtest.py CS: add step1_read_print 2014-04-06 22:13:14 -05:00

mal - Make a Lisp

Description

Mal is an interpreter for a subset of the Clojure programming language. Mal is implemented from scratch in 12 different languages:

  • Bash shell
  • C
  • C#
  • Clojure
  • Java
  • Javascript
  • GNU Make
  • mal itself
  • PHP
  • Postscript
  • Python
  • Ruby

Mal is also a learning tool. Each implentation of mal is separated into 11 incremental, self-contained (and testable) steps that demonstrate core concepts of Lisp. The last step is capable of self-hosting (running the mal implemenation of mal).

The mal (make a lisp) steps are:

  • step0_repl
  • step1_read_print
  • step2_eval
  • step3_env
  • step4_if_fn_do
  • step5_tco
  • step6_file
  • step7_quote
  • step8_macros
  • step9_interop
  • stepA_more

Mal was presented publicly for the first time in a lightning talk at Clojure West 2014 (unfortunately there is no video). See mal/clojurewest2014.mal for the presentation that was given at the conference (yes the presentation is a mal program).

Building/running implementations

Bash 4

cd bash
bash stepX_YYY.sh

C

The C implementation of mal requires the following libraries: glib, libffi6 and either the libedit or GNU readline library.

cd c
make
./stepX_YYY

C#

The C# implementation of mal has been tested on Linux using the Mono C# compiler (mcs) and the Mono runtime (version 2.10.8.1). Both are required to build and run the C# implementation.

cd cs
make
mono ./stepX_YYY

Clojure

cd clojure
lein with-profile +stepX trampoline run

Java 1.7

cd java
mvn compile
mvn -quiet exec:java -Dexec.mainClass=mal.stepX_YYY
    # OR
mvn -quiet exec:java -Dexec.mainClass=mal.stepX_YYY -Dexec.args="CMDLINE_ARGS"

Javascript/Node

cd js
npm update
node stepX_YYY.js

Mal

Running the mal implementation of mal involves running stepA of one of the other implementations and passing the mal step to run as a command line argument.

cd IMPL
IMPL_STEPA_CMD ../mal/stepX_YYY.mal

GNU Make 3.81

cd make
make -f stepX_YYY.mk

Perl 5

For readline line editing support, install Term::ReadLine::Perl or Term::ReadLine::Gnu from CPAN.

cd perl
perl stepX_YYY.pl

PHP 5.3

cd php
php stepX_YYY.php

Postscript Level 2/3

cd ps
gs -q -dNODISPLAY stepX_YYY.ps

Python (2 or 3)

cd python
python stepX_YYY.py

Ruby (1.8)

cd ruby
ruby stepX_YYY.rb