A compiler for literate Erlang
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.


Literate Erlang

A compiler for Literate Erlang - inspired by Literate CoffeeScript.


The purpose of this compiler is to help new users unfamiliar with Erlang to more easily understand Erlang code on GitHub by supporting a literate style.

This is intended to reduce the barriers to new users joining the community.


The Literate Erlang, like Literate CoffeeScript is blocks of Markdown interpolated with indented blocks of Erlang. This particular dialect is aimed at GitHub-flavoured Markdown.

The Literate Erlang compiler is implemented as a rebar plugin. For more details of rebar and its role in Erlang development see https://github.com/rebar/rebar.

Literate Erlang files end with .erl.md or .hrl.md and are stored in the /src_md and /include_md directories alonside the /src and /include directories as part of a normal Erlang/OTP file structure.

Details of the normal erlang directory structure can be found in the Erlang Design principles document http://www.erlang.org/doc/design_principles/applications.html#id73971

The compiler is implemented as a rebar pluging - the source code for it is in the directory /priv/rebar_plugins.

The compiler works by transforming the Literate Erlang to plain erlang and then compiling that.


Write your literate-erlang files in the directory /src_md naming them like mymodule.erl.md. Header files are written in /include_md and named myheder.hrl.md.

Compile them to normal erlang: rebar literate-compile

and then compile that up as per normal rebar compile

Note: you should put your rebar project.app.src file in /src_md from where will be copied over to src/.

Reverse Compiler


The tooling for literate Erlang is immature and will likely to remain that way for a long term. The reverse compiler enables authors of Erlang to write using their normal tools (ie emacs with erlang-mode or sublime-text with erlang mode) - but publish the results to their communities as Literate Erlang on GitHub.


The reverse compiler implmented as a rebar plugin called markup.

This turns all files ending .erl in the /src_md/.erl directory into markdown files which are placed in an /src_md directory and all .hrl files in include_md/.hrl directory into .hrl.md filed in /include_md.


The canonical version under version control is the markdown files in the /src_md and /include_md directories. So the first step is to compile them to erlang: rebar compile_literate

Then copy the .erl files to the directory src_md/.erl and the `..hrlfiles to/include_md/.hrl`` and edit them there.

The production of working beam files is then: rebar markup rebar literate_compile

Baby Steps

This is the simplest possible implementation of a Literate Erlang compiler designed to establish the idea and get it working on GitHub. There are plenty of ways it could be improved.

  • It has bugs - for instance (at the moment) you can't embed blocks of other code in the Erlang file (an example would be a javascript example in a module that parses JSON).
  • it has no tooling - no SublimeText plugins or Emacs major modes - they would be nice
  • it has no native Erlang markup compiler to turn it into html. There is an Erlang Markdown compiler (https://github.com/erlware/erlmarkdown) which could be used to do that. It currently supports normal Markdown and not GitHub-flavoured markdown.

The markdown emacs mode results in code that looks like this:

Sublime Text has a markdown mode which allows you to preview your markdown in a brower:

Users on Windows/Macs can have this preview rendered by GitHub for a higher level of fidelity.


Contributing is easy, fork and fire away.