mlml icon indicating copy to clipboard operation
mlml copied to clipboard

self-hosted compiler for a subset of OCaml

mlml

Build Status Coverage Status Docker Cloud Automated build Docker Cloud Build Status MicroBadger Image

mlml is a self-hosted toy compiler for a tiny subset of OCaml.

a detailed description can be found in my blog post (in Japanese): 自作OCamlコンパイラでセルフホストした - molecular coordinates

roadmap

  • [x] basic arithmetic
  • [x] variables
  • [x] if-then-else
  • [x] functions
    • [x] recursion
    • [x] mutual recursion
    • [x] closure
    • [x] currying
  • [x] tuples
  • [x] variants
  • [x] records
  • [x] pattern matching
  • [x] structual comparison
  • [x] primitive types
    • [x] string
    • [x] list
    • [x] bytes
    • [x] array
  • [x] formatted output with Printf
  • [x] modules
    • [x] definition
    • [x] aliases
    • [x] open
    • [x] dune-like bundler
  • [x] self-hosting!
  • [ ] exceptions
  • [ ] type checker & type inference

self hosting

mlml is self-hosted. i.e. mlml can compile itself.

./dev/exec.sh ./dev/self_host.sh

To obtain build artifacts, pass a path to local directory as below. You will see compiled binaries under ./self_host.

mkdir self_host
./dev/exec.sh ./dev/self_host.sh ./self_host

limitations

  • external definitions are only available for functions
  • all modules and paths are statically-resolved
  • all custom oeprators are left-associative
  • function keyword does not make an expression

development

If you have docker installed in your system, simply run

./dev/start.sh

to start the development.

You can run tests manually by running the following command:

./dev/exec.sh dune runtest

thanks

The code and algorithm in parser and lexer is strongly inspired by ushitora-anqou/aqaml