README.md

# LFE

[![Travis](https://img.shields.io/travis/rvirding/lfe.svg)](https://travis-ci.org/rvirding/lfe)
[![Hex.pm version](https://img.shields.io/hexpm/v/lfe.svg)](https://hex.pm/packages/lfe)
[![Hex.pm downloads](https://img.shields.io/hexpm/dt/lfe.svg)](https://hex.pm/packages/lfe)
[![Hex.pm weekly downloads](https://img.shields.io/hexpm/dw/lfe.svg)](https://hex.pm/packages/lfe)
[![Hex.pm daily downloads](https://img.shields.io/hexpm/dd/lfe.svg)](https://hex.pm/packages/lfe)

LFE, Lisp Flavoured Erlang, is a lisp syntax front-end to the Erlang
compiler. Code produced with it is compatible with "normal" Erlang
code. An LFE evaluator and shell is also included.


## Building

To compile LFE, simple clone it and compile:

```shell
    $ git clone https://github.com/rvirding/lfe.git
    $ cd lfe
    $ make compile
```

LFE requires Erlang be installed on the system and that the ``erl`` binary is
in ``$PATH``.


## Installation

Should you wish to have LFE available system-wide, you can run
the following ``make`` target:

```shell
    $ make install
```

By default this will create the programs ``lfe``, ``lfec`` and
``lfescript`` in the same directory as the ``erl`` program. This can
changed by defining the make variable ``DESTBINDIR`` to point to the
desired directory.

Note that the installation target will also install the LFE man pages
in the appropriate ``/usr/local/man/man*`` directories. This can be
changed by defining the make variable ``MANINSTDIR`` to point to the
desired top man directory.

So:

```shell
    $ make install DESTBINDIR=/Users/rv/bin MANINSTDIR=/Users/rv/man
```

will put the programs in ``/Users/rv/bin`` and the man pages in the
``/Users/rv/man/man*`` directories.


## REPL

If you're running LFE from a git clone working dir, you can start the REPL
like so after compiling:

```shell
    $ ./bin/lfe
    Erlang 17 (erts-6.0) [source] [64-bit] [smp:8:8] ...

    LFE Shell V6.0 (abort with ^G)
    >
```

If you have installed LFE, then you may start the REPL from any location:

```shell
    $ lfe
    Erlang 17 (erts-6.0) [source] [64-bit] [smp:8:8] ...

    LFE Shell V6.0 (abort with ^G)
    >
```

Likewise, you may run an LFE shell script in the same style as shell scripts
with:

```shell
    $ ./bin/lfe script-name script-arg-1 ...
```

or

```shell
    $ lfe script-name script-arg-1 ...
```

## Usage

The [docs site](http://lfe.github.io/docs.html) has several places to explore
that will show you how to start using LFE. However, here's a quick taste:

* start up an LFE REPL as demonstrated above
* then, do something like this:
```cl
    > (* 2 (+ 1 2 3 4 5 6))
    42
    > (* 2 (lists:foldl #'+/2 0 (lists:seq 1 6)))
    42
```

## Docker Support

LFE now supports Docker. To get started, simply do the following, once you
have Docker set up on your machine:

```bash
$ docker pull lfex/lfe
```

Alternatively, you could build the image yourself:

```bash
$ cd lfe
$ docker build .
```

Here are a couple of simple usage examples:

```bash
$ docker run lfex/lfe
42

$ docker run -i -t lfex/lfe lfe
Erlang/OTP 18 [erts-7.0] [source-4d83b58] [64-bit] [smp:8:8] ...

LFE Shell V7.0 (abort with ^G)
>
```

That last command will dump you into the LFE REPL on a running container
of the ``lfex/lfe`` Docker image. For more information on using Docker
with LFE, be sure to read the
[tutorial](http://blog.lfe.io/tutorials/2014/12/07/1837-running-lfe-in-docker/).


## Documentation

* [Quick Start](https://lfe.gitbooks.io/quick-start/content/)
* LFE [user guide](doc/user_guide.txt)
* [version history](doc/src/version_history.md)

Files with more technical details:

* [lfe.txt](doc/lfe.txt)
* [lfescript.txt](doc/lfescript.txt)
* [lfe_macro.txt](doc/lfe_macro.txt)
* [lfe_lib.txt](doc/lfe_lib.txt)
* [lfe_io.txt](doc/lfe_io.txt)
* [lfe_gen.txt](doc/lfe_gen.txt)
* [lfe_comp.txt](doc/lfe_comp.txt)
* [lfe_bits.txt](doc/lfe_bits.txt)

If you would like to make changes to the LFE documentation and then regenerate
the docs, you'll want to read the instructions here:

* [Updating LFE Documentation](doc/src/updating_docs.md)