A wrapper around bits of LFE to make using Erjang (Java) from LFE more convenient
Pull request Compare This branch is even with oubiwann:master.
Latest commit 5d6027d Apr 23, 2014 @oubiwann oubiwann Fixed bad apostrophe.
Permalink
Failed to load latest commit information.
doc
images/logos
patches
src
test/unit
.gitignore
.travis.yml
Makefile
README.rst
common.mk
jlfe.mk
package.exs
rebar.config

README.rst

jlfe

An experimental wrapper around bits of LFE

images/logos/DukeOfferingLFE-square-tiny.png

Introduction

This project is 1100100% experimentation.

Its sole purpose is to explore the possibility of slightly increasing programmer convenience when using LFE on Erjang (Erlang on the JVM).

Initially, chunks of LFE code were copied, but the latest version requires that one manually make a single change to a function (instructions below), and then does the rest in the jlfe code.

Development Information

Dependencies

This project assumes that you have lfetool installed somwhere in your $PATH. Also, we're not going to cover the installation of Java -- you will need Java installed on your system in order to run jlfe ;-)

This project depends upon the following, which are saved to ./deps when you run make get-deps:

  • LFE (Lisp Flavored Erlang; needed only to compile)
  • lfeunit (needed only to run the unit tests)
  • lfe-utils

Dependencies not installed automatically:

  • lfetool (click the link for installation instructions)
  • kerl (see below)
  • Erjang (see below)
  • rlwrap (readline support for the Erjang shell; installable on many linux distros; on Mac OS X, install with Homebrew)

If you don't have rebar, kerl and Erlang installed:

$ lfetool install rebar
$ lfetool install kerl
$ lfetool install erlang R16B
$ . /opt/erlang/R16B/activate

Erjang installation is similarly easy:

$ lfetool install erjang

Obtaining and Building jlfe

Building jlfe and its dependencies is as easy as this:

$ git clone https://github.com/oubiwann/jlfe.git
$ cd jlfe
$ make compile

That last make target will do the following:

  • Download all the project dependencies,
  • Apply a patch to LFE to accept the jlfe form (.XXX ...), and
  • Compile all the dependencies, the patched LFE, and jlfe.

jlfe Usage

With everything built, you're now ready to play. To run the examples below, start the jlfe REPL:

$ lfetool repl jlfe

Syntax Additions

Constructors

> (.java.util.HashMap)
()
>
> (.java.lang.Double 42)
42.0

Or you can use the short-cut for all java.lang.* classes:

> (.Double 42)
42.0

Static Methods

> (.java.lang.String:getName)
java.lang.String

or

> (.String:getName)
java.lang.String
>
> (.Math:sin 0.5)
0.479425538604203

Static Field Variables

e.g., constants:

> (.Math:PI)
3.141592653589793
>
> (.java.math.BigDecimal:ROUND_CEILING)
2

Nested Classes

> (.java.util.AbstractMap$SimpleEntry "a" "b")
#B()

Utility Functions

Some Java types from Erjang don't render anything useful when evaluated:

> (set bool (.Boolean true))
#B()
> (set flt (.Float 42))
#B()
> (set bigdec (.java.math.BigDecimal 42))
#B()

The value-of function lets us treat Java objects as distinct values while still keeping the object around, should we want to call any methods on it, etc.:

> (jlfe-types:value-of bool)
true
> (jlfe-types:value-of flt)
42.0
> (jlfe-types:value-of bigdec)
42.0

Types that don't need special treatment are passed through, as-is:

> (jlfe-types:value-of (.Integer 42))
42