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
Joel Martin 393c1c447f Ruby: add step9_interop
- Just (rb* "str") which evals the string and returns the result
2014-04-10 23:31:04 -05:00
bash Add stats-lisp target (only env, core, stepA) 2014-04-10 19:27:42 -05:00
c Add stats-lisp target (only env, core, stepA) 2014-04-10 19:27:42 -05:00
clojure Add stats-lisp target (only env, core, stepA) 2014-04-10 19:27:42 -05:00
cs Add stats-lisp target (only env, core, stepA) 2014-04-10 19:27:42 -05:00
docs Fix metadata on functions. 2014-04-09 23:58:27 -05:00
java Add stats-lisp target (only env, core, stepA) 2014-04-10 19:27:42 -05:00
js Add stats-lisp target (only env, core, stepA) 2014-04-10 19:27:42 -05:00
make Add stats-lisp target (only env, core, stepA) 2014-04-10 19:27:42 -05:00
mal Add stats-lisp target (only env, core, stepA) 2014-04-10 19:27:42 -05:00
php Add stats-lisp target (only env, core, stepA) 2014-04-10 19:27:42 -05:00
ps Add stats-lisp target (only env, core, stepA) 2014-04-10 19:27:42 -05:00
python Add stats-lisp target (only env, core, stepA) 2014-04-10 19:27:42 -05:00
ruby Ruby: add step9_interop 2014-04-10 23:31:04 -05:00
tests Ruby: add step8_macros 2014-04-10 23:27:50 -05:00
.gitignore C#: add step2_eval. 2014-04-06 22:38:26 -05:00
.gitmodules JS: fix josh.js submodule for gh-pages compatibility. 2014-04-06 17:06:07 -05:00
core.mal Current state of mal for Clojure West lighting talk. 2014-03-24 16:32:24 -05:00
Makefile Ruby: step0, step1 2014-04-10 20:34:29 -05:00
mal.html JS: fix web interface. 2014-04-06 16:40:55 -05:00
README.md README: add C# info. Cleanup top Makefile. 2014-04-09 22:15:54 -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 implemetated from scratch in 11 different languages:

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

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

PHP 5.3

cd php
php stepX_YYY.php

Postscript Level 2/3

cd ps
gs -q -dNODISPLAY stepX_YYY.ps

Python 2.X

cd python
python stepX_YYY.py