← overview

ClojureCLR

Implemented
96.7%962 / 995 vars
Reported clojure-version
1.12.2
Clojure (JVM) Version
1.12.4
Snapshot Taken
2026-05-22 20:14 UTC

Per-Namespace Implementation

NamespaceImplementedMismatchedMissingDialect-Only
clojure.core99.3%674 / 6793537
clojure.core.protocols100.0%11 / 11000
clojure.core.reducers90.5%19 / 21020
clojure.data100.0%5 / 5000
clojure.datafy100.0%2 / 2000
clojure.edn100.0%2 / 2000
clojure.instant40.0%2 / 5032
clojure.math48.9%22 / 4522320
clojure.pprint100.0%26 / 26000
clojure.set100.0%12 / 12000
clojure.spec.alpha100.0%87 / 87000
clojure.string100.0%21 / 21000
clojure.template100.0%2 / 2000
clojure.test100.0%39 / 39000
clojure.walk100.0%10 / 10000
clojure.zip100.0%28 / 28000

Documented Extensions (2)

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

JVM-static value remap2 entries
  • clojure.clr.io -- CLR filesystem helpers

    Since
    clr-1.0
    Affected Vars
    • clojure.clr.io/file
    • clojure.clr.io/reader
    • clojure.clr.io/writer
    Rationale
    ClojureCLR equivalent of clojure.java.io for .NET FileInfo / Stream IO. Not in v1's target list because the comparison shape is anchored on Clojure (JVM)'s clojure.* tree.
  • clojure.clr.shell -- CLR process invocation

    Since
    clr-1.0
    Affected Vars
    • clojure.clr.shell/sh
    Rationale
    Equivalent of clojure.java.shell for System.Diagnostics.Process. Same semantic shape as Clojure (JVM); different namespace.

Documented Intentional Divergences (8)

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

Type-system representation1 entry
  • Host classes are CLR System.*, not JVM java.*

    Since
    clr-1.0
    Rationale
    `(class x)` returns a CLR Type object. Code that pattern-matches on `java.lang.Long` or similar names doesn't work; CLR equivalents are `System.Int64`, `System.String`, etc.
Reader behavior1 entry
  • Reader conditional :clj does not fire under CLR

    Since
    clr-1.0
    Rationale
    Portable code uses :cljr (or :default) to target ClojureCLR. Code under :clj is invisible to CLR's reader.
Concurrency primitives1 entry
  • Concurrency primitives use CLR thread pool

    Since
    clr-1.0
    Rationale
    Atom / future / agent are implemented on top of System.Threading, not java.util.concurrent. The semantics match Clojure (JVM); the underlying threads differ if interop'd with.
Error message shapes1 entry
  • Throwables are System.Exception, not java.lang.Throwable

    Since
    clr-1.0
    Rationale
    `(catch Throwable e ...)` is not portable to CLR; catch `Exception` instead. Portable code uses `:cljr` reader conditionals around catch targets.
JVM-static value remap4 entries
  • Environment variables read via System.Environment

    Since
    clr-1.0
    Rationale
    `System/getenv` doesn't exist on CLR; the equivalent is `System.Environment/GetEnvironmentVariable`. Portable code uses a host-conditional helper.
  • gen-class emits CLR MSIL, not JVM bytecode

    Since
    clr-1.0
    Rationale
    `gen-class` works on CLR but the AOT artifact is a .NET assembly, not a .class file. Consumers that load the generated class via JVM tooling do not work.
  • clojure.java.io is intentionally absent

    Since
    clr-1.0
    Rationale
    CLR's IO abstractions are System.IO.*; a separate ClojureCLR-side namespace `clojure.clr.io` covers the equivalent surface. Code that requires `clojure.java.io` is JVM-bound.
  • proxy targets CLR types, not JVM interfaces

    Since
    clr-1.0
    Rationale
    `proxy` is supported on CLR but emits CLR types extending CLR base classes. Proxies of JVM-only interfaces (Runnable, Callable) do not translate.

History (1 Snapshot)

DateImplementedVars
2026-05-2296.7%962 / 995