• Clojang
  • Archives
  • Categories
  • Tags
  • Authors
  • Community
  • About
  • Docs
    • API Comparison
    • clojang
    • jiface
    • JInterface Erlang Docs
    • Jinterface API Reference
    • clojang
    • jiface
    • agent
    • jinterface-builder
    • The Clojang Collection
    • Travis CI

About

"Clojang" is a set of libraries and tools (including the library clojang-proper) that are dedicated to Clojure-BEAM interop, where BEAM languages include all those of the Erlang ecosystem: Erlang, LFE, Elixir, Joxa, Reia, Luerl, Erlog, etc.

Clojang supports production deployments of distributed, fault-tolerant, soft real-time BEAM/JVM applications with appropriate restart and fail-over strategies and hot code-loading.

In particular, the aim of Clojang is to support production deployments of distributed, fault-tolerant, soft real-time BEAM/JVM applications, capable of running JVM code in supervision trees with appropriate restart and fail-over strategies, hot code-loading (live system updates with no downtime), and the like.

From the developer perspective, Clojang wants to make OTP-based communications between BEAM languages and the JVM as Clojure-idiomatic as possible and as natural to BEAM programmers as can reasonably be provided.

For an overview of the three primary ways in which one may develop JVM-BEAM interoperable applications, be sure to read the API comparison docs. To see how LFE and Clojure applications can interoperate, you'll want to read the "Talking to Servers" tutorial.

Sample Code

Here's a Clojure OTP server written using Clojang:

(defn ping-pong
      []
      (let [init-state 0]
        (loop [png-count init-state]
          (match (receive)
            [:ping caller]
              (do (! caller :pong)
                (recur (inc png-count)))
            [:get-ping-count caller]
              (do (! caller png-count)
                (recur png-count))
            [:stop caller]
              (do (! caller :stopping)
                  :stopped)))))
    

And here's LFE talking to Clojure:

(clojang-lfe@host)> (! #(default clojang@host) `#(ping ,(self)))
    #(ping <0.34.0>)
    (clojang-lfe@host)> (! #(default clojang@host) `#(ping ,(self)))
    #(ping <0.34.0>)
    (clojang-lfe@host)> (! #(default clojang@host) `#(ping ,(self)))
    #(ping <0.34.0>)
    (clojang-lfe@host)> (c:flush)
    Shell got pong
    Shell got pong
    Shell got pong
    ok
    (clojang-lfe@host)> (! #(default clojang@host) `#(get-ping-count ,(self)))
    #(get-count <0.34.0>)
    (clojang-lfe@host)> (c:flush)
    Shell got 3
    ok
    

Here's part of an LFE OTP gen_server:

(defun handle_call
      (('ping _caller state-data)
        `#(reply pong ,(+ 1 state-data)))
      (('ping-count _caller state-data)
        `#(reply ,state-data ,state-data))
      (('stop _caller state-data)
        `#(stop shutdown ok ,state-data))
      ((_message _caller state-data)
        `#(reply ,(unknown-command) ,state-data)))
    

And here's Clojure talking to LFE:

clojang.dev=> (rpc/! :clojang-lfe :ping-pong :ping)
    :ok
    clojang.dev=> (rpc/! :clojang-lfe :ping-pong :ping)
    :ok
    clojang.dev=> (rpc/! :clojang-lfe :ping-pong :ping)
    :ok
    clojang.dev=> (rpc/receive :clojang-lfe)
    :pong
    clojang.dev=> (rpc/receive :clojang-lfe)
    :pong
    clojang.dev=> (rpc/receive :clojang-lfe)
    :pong
    clojang.dev=> (rpc/! :clojang-lfe :ping-pong :get-ping-count)
    :ok
    clojang.dev=> (rpc/receive :clojang-lfe)
    3
    
 
  • Archives
  • Categories
  • Tags
  • Authors
  • About
  • Clojure
  • Erlang
  • LFE/X
  • Elixir
  • Clojang
 

Design © 2013 Thomas Park | Design and Content © 2017 Clojang