10 Java Interop
10.2 Lisp Flavored Erjang
10.2.3 Getting Started
As you might expect, we use lfetool to work with Erjang :-) Here's how you
install it:
$ lfetool install erjang
On a fast internet connection, this should take less than 3 minutes to download
Erjang, download Erlang/OTP, and then create the necessary .jar files.
Once lfetool has downloaded, compiled, and installed Erjang, you'll be
ready for the next step: hopping into the REPL:
$ lfetool repl jlfe
LFE Shell V5.10.4 (abort with ^G)
> (* 2 (+ 1 2 3 4 5 6))
42
> (* 2 (lists:foldl (lambda (n acc) (+ n acc)) 0 (lists:seq 1 6)))
42
For that to work, you will either need to have lfe in your path, or be in
an LFE project directory that you created with lfetool.
10.2.4 Using LFE Projects from Erjang
If you've got an LFE project you have already created and want to see how it
runs on Erjang with jlfe, go ahead and start up the jlfe REPL in that
project directory -- cd to your project dir and start the REPL like we did
in the above example.
For those that don't have one, try this out:
$ git clone https://github.com/lfe/exemplar.git
$ cd exemplar
$ lfetool repl jlfe
LFE Shell V5.10.4 (abort with ^G)
Now start up the REPL and call some functions:
> (slurp '"src/exemplar-html.lfe")
#(ok exemplar-html)
> (p '"My paragraph.")
"<p>My paragraph.</p>"
> (html (body (div (p '"A paragraph in my page."))))
"<html><body><div><p>A paragraph in my page.</p></div></body></html>"
>
10.2.5 Calling Java from LFE
10.2.5.1 Static Method on a Class
Here's an example of calling as static method on a Java class from LFE:
> (java.lang.Math:sin 0.5)
0.479425538604203
>
10.2.5.2 Static Field on a Class
For right now, in order to activate the Erjang BIFs java:get_static/2 and
java:call/4, you need to create a java module:
cat > java.lfe
(defmodule java)
(defun noop ()
'noop)
^D
Start up the REPL:
$ lfetool repl jlfe
Once your java module is compiled, you'll be able to access static fields:
> (c 'java)
#(module java)
> (java:get_static 'java.lang.Math 'PI)
3.141592653589793
10.2.5.3 Member on an Instance
In order to call members on instances, you need to create an instance first:
> (set rand-obj (java.util.Random:new))
#B()
You can confirm the type that you just created:
> (java:call rand-obj 'getClass '() '())
java.util.Random
Erjang's java:call/4 function takes two additional parameters that we're
not using right now: types and arguments.
Here's how you call the various Random instance methods:
> (call rand-obj 'nextInt)
1845347843
> (call rand-obj 'nextDouble)
0.34850947916661346
You may also make the Erjang call:
> (java:call rand-obj 'nextInt '() '())
-2083227816
> (java:call rand-obj 'nextDouble '() '())
0.8218552203785259
10.2.5.4 Working with Files from Java
TBD