← overview

ClojureScript (planck)

Implemented
53.5%532 / 995 vars
Reported clojure-version
1.11.132
Clojure (JVM) Version
1.12.4
Snapshot Taken
2026-05-23 16:04 UTC

Per-Namespace Implementation

NamespaceImplementedMismatchedMissingDialect-Only
clojure.core59.4%403 / 679110276425
clojure.core.protocols0.0%0 / 110110
clojure.core.reducers0.0%0 / 210210
clojure.data0.0%0 / 5050
clojure.datafy0.0%0 / 2020
clojure.edn100.0%2 / 2108
clojure.instant0.0%0 / 5050
clojure.math0.0%0 / 450450
clojure.pprint76.9%20 / 260633
clojure.set100.0%12 / 12000
clojure.spec.alpha67.8%59 / 8712826
clojure.string95.2%20 / 21010
clojure.template0.0%0 / 2020
clojure.test23.1%9 / 3913018
clojure.walk70.0%7 / 10030
clojure.zip0.0%0 / 280280

Documented Extensions (2)

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

Collection semantics1 entry
  • cljs.spec.gen.alpha for generator wiring

    Since
    cljs-0.1
    Affected Vars
    • cljs.spec.gen.alpha/generator
    • cljs.spec.gen.alpha/sample
    Rationale
    Generator-side surface for cljs.spec.alpha; Clojure (JVM) exposes the equivalent via clojure.spec.gen.alpha. Captured as a cljs.* namespace for documentation; not in the v1 :include-only-namespaces filter.
JVM-static value remap1 entry
  • JavaScript-host interop sugar

    Since
    cljs-0.1
    Affected Vars
    • cljs.core/aclone
    • cljs.core/aget
    • cljs.core/array
    • cljs.core/aset
    • cljs.core/clj->js
    • cljs.core/js->clj
    Rationale
    Bidirectional conversion between CLJS data and JS data, plus typed-array helpers. Necessary for JS host interop; absent from Clojure (JVM) by design.

Documented Intentional Divergences (10)

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

Type-system representation1 entry
  • No JVM class hierarchy

    Since
    cljs-0.1
    Rationale
    CLJS targets JavaScript; there is no java.lang.Class, no clojure.lang.* concrete types. type returns the JS constructor function. Code that pattern-matches on JVM-class names is not portable.
Numeric tower1 entry
  • Number tower follows JavaScript, not JVM

    Since
    cljs-0.1
    Rationale
    Numbers are JavaScript numbers (IEEE-754 doubles with integer fast path). No Long, no Ratio, no BigDecimal as separate types. Integer overflow silently converts to double; *' / +' have no additional precision over * / +.
Reader behavior1 entry
  • Reader conditional :clj does not fire under CLJS

    Since
    cljs-0.1
    Rationale
    Portable code must use :cljs (or :default) to target CLJS. Code under :clj is invisible to the CLJS reader.
Concurrency primitives1 entry
  • Concurrency primitives are JS-event-loop-bound

    Since
    cljs-0.1
    Rationale
    No JVM threads. atom is synchronous as in Clojure (JVM). future, agent, promise are absent or async-only; code relying on blocking semantics is not portable.
JVM-static value remap3 entries
  • clojure.java.io is absent

    Since
    cljs-0.1
    Rationale
    No File / InputStream abstractions. CLJS hosts have host-specific IO (planck.io, lumo.io, browser fetch); excluded from parity comparison intentionally.
  • proxy and gen-class are not provided

    Since
    cljs-0.1
    Rationale
    No JVM bytecode emitter. JS-target equivalents are deftype + protocols or specify-based JS-object construction.
  • No clojure.reflect / no runtime class inspection

    Since
    cljs-0.1
    Rationale
    JS has no class system to reflect on. Code that inspects member signatures must use JS interop (.constructor, Object.keys, etc.) directly.
Namespace mechanics3 entries
  • clojure.math is not provided

    Since
    cljs-0.1
    Rationale
    JS exposes Math/ statics directly; CLJS code uses js/Math.sin etc. or wraps them per-codebase rather than via a clojure.math namespace.
  • Some namespaces use the cljs.* prefix

    Since
    cljs-0.1
    Rationale
    clojure.core, clojure.spec.alpha, clojure.test, clojure.pprint are exposed as cljs.core, cljs.spec.alpha, cljs.test, cljs.pprint respectively. clojure.string, clojure.set, clojure.walk keep their Clojure (JVM) names.
  • clojure.edn is cljs.reader

    Since
    cljs-0.1
    Rationale
    CLJS exposes the EDN reader as cljs.reader; the portable :namespace-renames in this tool maps cljs.reader -> clojure.edn for comparison purposes, but the canonical CLJS API name is cljs.reader/read-string.

Drift Since 2026-05-22

Added Vars
0
Removed Vars
0
Changed Vars
0
Implementation Delta
+0.0000

History (2 Snapshots)

DateImplementedVars
2026-05-2353.5%532 / 995
2026-05-2253.5%532 / 995