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
| Namespace | Implemented | Mismatched | Missing | Dialect-Only |
|---|---|---|---|---|
| clojure.core | 99.3%674 / 679 | 3 | 5 | 37 |
| clojure.core.protocols | 100.0%11 / 11 | 0 | 0 | 0 |
| clojure.core.reducers | 90.5%19 / 21 | 0 | 2 | 0 |
| clojure.data | 100.0%5 / 5 | 0 | 0 | 0 |
| clojure.datafy | 100.0%2 / 2 | 0 | 0 | 0 |
| clojure.edn | 100.0%2 / 2 | 0 | 0 | 0 |
| clojure.instant | 40.0%2 / 5 | 0 | 3 | 2 |
| clojure.math | 48.9%22 / 45 | 2 | 23 | 20 |
| clojure.pprint | 100.0%26 / 26 | 0 | 0 | 0 |
| clojure.set | 100.0%12 / 12 | 0 | 0 | 0 |
| clojure.spec.alpha | 100.0%87 / 87 | 0 | 0 | 0 |
| clojure.string | 100.0%21 / 21 | 0 | 0 | 0 |
| clojure.template | 100.0%2 / 2 | 0 | 0 | 0 |
| clojure.test | 100.0%39 / 39 | 0 | 0 | 0 |
| clojure.walk | 100.0%10 / 10 | 0 | 0 | 0 |
| clojure.zip | 100.0%28 / 28 | 0 | 0 | 0 |
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/fileclojure.clr.io/readerclojure.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)
| Date | Implemented | Vars |
|---|---|---|
| 2026-05-22 | 96.7% | 962 / 995 |