← overview

Clojerl

Implemented
74.3%739 / 995 vars
Reported clojure-version
0.0.0-1.4ad14e5
Clojure (JVM) Version
1.12.4
Snapshot Taken
2026-05-23 20:49 UTC

Per-Namespace Implementation

NamespaceImplementedMismatchedMissingDialect-Only
clojure.core72.3%491 / 6792518826
clojure.core.protocols0.0%0 / 110110
clojure.core.reducers90.5%19 / 21021
clojure.data60.0%3 / 5021
clojure.datafy0.0%0 / 2020
clojure.edn100.0%2 / 2000
clojure.instant60.0%3 / 5121
clojure.math0.0%0 / 450450
clojure.pprint100.0%26 / 262026
clojure.set100.0%12 / 12000
clojure.spec.alpha97.7%85 / 87125
clojure.string100.0%21 / 21000
clojure.template100.0%2 / 2000
clojure.test94.9%37 / 39123
clojure.walk100.0%10 / 10000
clojure.zip100.0%28 / 28000

Documented Extensions (1)

Vars in this surface that are intentionally outside Clojure (JVM), as documented in the dialect's registry.

JVM-static value remap1 entry
  • erlang/* -- direct BEAM module interop

    Since
    clojerl-0.1
    Affected Vars
    • erlang/binary.split
    • erlang/lists.reverse
    • erlang/maps.get
    • erlang/os.getenv
    Rationale
    BEAM modules become Clojerl namespaces under the `erlang/` prefix. This is the analogue of JVM class interop -- the surface is everything OTP ships, surfaced as Clojure-callable functions.

Documented Intentional Divergences (8)

Decisions where this surface intentionally departs from Clojure (JVM), as documented in the dialect's registry.

Numeric tower1 entry
  • Numeric tower follows the BEAM, not the JVM

    Since
    clojerl-0.1
    Rationale
    Integers are arbitrary-precision (BEAM's `integer()`). Floats are IEEE-754 double. `bigint` is not a separate type. Ratios are not a built-in BEAM type.
Reader behavior1 entry
  • Reader conditional :clj does not fire under Clojerl

    Since
    clojerl-0.1
    Rationale
    Clojerl uses :clje for its own branches. Code under :clj is not evaluated by Clojerl's reader.
Collection semantics1 entry
  • All values are immutable, including strings

    Since
    clojerl-0.1
    Rationale
    On the BEAM there are no mutable references that user code can observe. Strings are lists of integers or binaries; mutation operations from JVM-Clojure idioms (StringBuilder, transient!) have different shapes.
Concurrency primitives1 entry
  • Concurrency is process-and-message, not shared-state

    Since
    clojerl-0.1
    Rationale
    Clojerl inherits BEAM's actor model: lightweight processes communicate by sending messages. Refs and agents do not map to that model. Atoms are implemented; deref/swap! semantics match Clojure (JVM)'s where the value is in-process.
Error message shapes1 entry
  • Exceptions are Erlang errors, not JVM Throwables

    Since
    clojerl-0.1
    Rationale
    Erlang raises errors tagged as `error`, `throw`, or `exit`. Clojerl's catch syntax is `(catch _ e ...)` for any kind of error; `(catch :error reason ...)` for a specific Erlang error class. Portable code that catches JVM exception classes must use a :clje reader conditional.
JVM-static value remap1 entry
  • Host runtime is the BEAM, not the JVM

    Since
    clojerl-0.1
    Rationale
    Interop targets Erlang modules. JVM-static names (System/getenv, Math/PI, java.io.File) do not resolve; equivalents reach into OTP's `os`, `math`, `file`, `binary`, etc. via Clojerl's erlang/* shim namespace.
Namespace mechanics2 entries
  • Pre-1.0; behavior may change between releases

    Since
    clojerl-0.1
    Rationale
    Clojerl is pre-1.0. The current snapshot reflects what is implemented today; the divergence list will continue to evolve.
  • Many Clojure (JVM) stdlib namespaces are not implemented

    Since
    clojerl-0.1
    Rationale
    Clojerl ships clojure.core, .string, .set, .walk, .test, .template. clojure.edn, .pprint, .math, .data, .zip, .datafy, .instant, .core.protocols, .core.reducers, .spec.alpha are not yet ported.

History (1 Snapshot)

DateImplementedVars
2026-05-2374.3%739 / 995