Clean up codebase: rename stdlib layer, strip porting residue, fix tooling

Rename src/jolt -> stdlib (the runtime-loaded layer; jolt-core stays the
seed-baked layer) and update the loader / emit-image / doc paths. Drop dead
code: the spike/ experiments, the duplicate clojuredocs-export.edn (json moves
to tools/), the Janet-era jolt.http binding, and the orphaned
persistent_vector.clj whose ns/path didn't even match.

Strip porting residue from comments and docstrings across host/chez, jolt-core,
stdlib, tests, and docs: internal issue ids, "Phase N" markers, and the "vs
Janet" historical exposition, leaving present-tense descriptions and the real
JVM-Clojure semantic contrasts. Same pass over the corpus suite labels. The seed
is unchanged (docstrings/comments aren't emitted), so the self-host fixpoint and
corpus are untouched.

Port tools/spec_coverage.py off the dead janet probe to bin/joltc and regenerate
coverage.md; drop the dead :host/janet rule from certify.clj and regenerate the
conformance profile. Add docs/host-interop.md (the JVM shims and how to register
your own host class from a library) and a writing-style note in CLAUDE.md.

Stabilize the four racy concurrency corpus cases (future-cancel and agent
send/send-off): give the future a sleeping body and the agent a slow action, so
cancel reliably catches an in-flight future and deref reliably reads the
pre-update snapshot. They certify deterministically now, so drop their :flaky
allowlist entries and the orphaned legend.
This commit is contained in:
Yogthos 2026-06-22 22:18:00 -04:00
parent c18f8087f0
commit 33eff7c7d8
112 changed files with 970 additions and 1621 deletions

View file

@ -50,10 +50,10 @@ clojure -M test/conformance/certify.clj test/chez/corpus.edn --edn /tmp/report.e
## Current state
Of ~2487 vanilla-certifiable rows, **>2410 match reference Clojure exactly**; the
~70 divergences are all classified (deliberate deltas + 4 tracked bugs). The corpus
is trustworthy as a spec, with the host-specific deltas made explicit rather than
hidden.
Of ~2740 vanilla-certifiable rows, **>2730 match reference Clojure exactly**; the
handful of divergences are all classified (deliberate deltas plus a few tracked
bugs). The corpus is trustworthy as a spec, with the host-specific deltas made
explicit rather than hidden.
## Adding / changing cases

View file

@ -42,7 +42,7 @@ the canonical, frozen contract**: it is what every runtime consumes, what
Historically every `:expected` was hand-written. `certify.clj` removes that
weakness: it evaluates every `:actual` (and `:expected`) on **JVM Clojure** in a
fresh `user` namespace and checks jolt's `:expected` against what real Clojure
produces. Of ~2740 vanilla-certifiable rows, **>2660 match reference Clojure
produces. Of ~2740 vanilla-certifiable rows, **>2730 match reference Clojure
exactly**. The rest are classified (see below) — none are silently wrong.
```sh
@ -62,7 +62,7 @@ each **non-portable** case by the feature it requires. Cases *not* in the profil
are **portable** — they must pass on any faithful Clojure.
A runtime's **conformance level** = portable cases + the feature families it
implements. Current profile (≈2670 portable, ≈249 non-portable):
implements. Current profile (≈2735 portable, ≈167 non-portable):
| Feature | Meaning |
|---------|---------|

View file

@ -1,4 +1,4 @@
;; certify.clj (jolt-xsfe) — certify the jolt corpus against reference JVM Clojure.
;; certify.clj — certify the jolt corpus against reference JVM Clojure.
;;
;; The corpus (test/chez/corpus.edn) carries hand-written :expected values. This
;; script runs each row's :actual and :expected through REAL JVM Clojure and checks
@ -154,7 +154,6 @@
(defn jvm-error-feature [actual]
(let [a (str/lower-case actual)]
(cond
(re-find #"janet" a) :host/janet
(re-find #"chan|>!|<!|go-loop|\(go |alts!|core\.async" a) :async/core-async
(re-find #"load-string|\beval\b|read-string.*eval" a) :runtime/eval
(re-find #"-array|into-array|to-array|aget|aset|aclone|alength" a) :host/arrays

View file

@ -1,10 +1,8 @@
{:doc
"Rows of test/chez/corpus.edn whose :expected differs from reference JVM Clojure. The corpus is JVM-sourced (regen-corpus.clj), so this list is only the rows whose JVM value is an opaque host object that cannot round-trip to readable source — Java arrays, transients, atoms, beans, proxies, and chunks print as #object[..@addr] with a per-run identity — plus the (fn* foo) strictness case and a few racy concurrency cases (:flaky). For those the corpus keeps jolt's value. certify.clj gates on NEW (unlisted) divergences and STALE entries. Keyed by [suite label].",
"Rows of test/chez/corpus.edn whose :expected differs from reference JVM Clojure. The corpus is JVM-sourced (regen-corpus.clj), so this list is only the rows whose JVM value is an opaque host object that cannot round-trip to readable source — Java arrays, transients, atoms, beans, proxies, and chunks print as #object[..@addr] with a per-run identity — plus the (fn* foo) strictness case. For that the corpus keeps jolt's value. certify.clj gates on NEW (unlisted) divergences and STALE entries. Keyed by [suite label].",
:legend
{:numeric-model
"jolt has a numeric tower (exact integer / Ratio / double); no BigDecimal",
:concurrency-model
"Janet isolated-heap snapshot futures/agents/pmap; atoms snapshot, not shared",
:host-model
"no JVM host: classes->name strings, type->symbol, *in* is a map, inline-impl extenders, duck-typed with-open close",
:reader-model
@ -19,18 +17,6 @@
[{:suite "forms / fn",
:label "no param vector",
:category :strictness}
;; racy: agent send / future-cancel observe state that the action thread may or
;; may not have reached yet, so the JVM value is nondeterministic run-to-run.
{:suite "state / agents (synchronous shim)", :label "send applies",
:category :concurrency-model, :flaky true}
{:suite "state / agents (synchronous shim)", :label "send-off applies",
:category :concurrency-model, :flaky true}
{:suite "clojure.core / futures — predicates",
:label "cancel an in-flight future returns true",
:category :concurrency-model, :flaky true}
{:suite "clojure.core / futures — predicates",
:label "future-cancelled? after cancel",
:category :concurrency-model, :flaky true}
{:suite "io / cold tagged types via print-method",
:label "atom override fires nested",
:category :reader-model}

View file

@ -1,73 +1,53 @@
{:doc
"Conformance profile for test/chez/corpus.edn, generated by certify.clj. Each entry is a NON-portable case (keyed by [suite label]) and the host feature(s) it requires. Cases NOT listed are portable — they pass on any faithful Clojure. A runtime's conformance LEVEL = portable + the feature families it implements. See SPEC.md.",
:clojure-version "1.12.5",
:portable-count 2674,
:non-portable-count 246,
:portable-count 2735,
:non-portable-count 167,
:feature-counts
{:concurrency/snapshot 5,
:host/arrays 12,
:host/janet 16,
:host/jvm-interop 174,
:impl/representation 1,
:numerics/double-only 17,
{:host/arrays 10,
:host/jvm-interop 149,
:perf/unbounded 1,
:printer/jolt 4,
:reader/jolt 13,
:strictness/jolt 3},
:printer/jolt 2,
:reader/jolt 4,
:strictness/jolt 1},
:entries
[{:suite "*ns* / identity & printing",
:label "tracks in-ns",
:bucket :jvm-error,
:features [:host/jvm-interop]}
{:suite "clojure.core / futures — predicates",
:label "cancel an in-flight future returns true",
:bucket :divergent,
:features [:concurrency/snapshot]}
{:suite "clojure.core / futures — snapshot (copy) semantics",
:label "captured atom is snapshotted, not shared",
:bucket :divergent,
:features [:concurrency/snapshot]}
{:suite "clojure.core / leaf batch (complement fnil munge etc.)",
:label "bigdec",
:bucket :divergent,
:features [:numerics/double-only]}
{:suite "clojure.core / leaf batch (complement fnil munge etc.)",
:label "supers empty set",
:bucket :jvm-error,
:features [:host/jvm-interop]}
{:suite "clojure.core / pmap family",
:label "snapshot semantics",
:bucket :divergent,
:features [:concurrency/snapshot]}
{:suite "clojure.math (jolt-h79)",
{:suite "clojure.math",
:label "PI",
:bucket :jvm-error,
:features [:host/jvm-interop]}
{:suite "clojure.math (jolt-h79)",
{:suite "clojure.math",
:label "floor",
:bucket :jvm-error,
:features [:host/jvm-interop]}
{:suite "clojure.math (jolt-h79)",
{:suite "clojure.math",
:label "pow",
:bucket :jvm-error,
:features [:host/jvm-interop]}
{:suite "clojure.math (jolt-h79)",
{:suite "clojure.math",
:label "round",
:bucket :jvm-error,
:features [:host/jvm-interop]}
{:suite "clojure.math (jolt-h79)",
{:suite "clojure.math",
:label "signum",
:bucket :jvm-error,
:features [:host/jvm-interop]}
{:suite "clojure.math (jolt-h79)",
{:suite "clojure.math",
:label "sqrt",
:bucket :jvm-error,
:features [:host/jvm-interop]}
{:suite "clojure.math (jolt-h79)",
{:suite "clojure.math",
:label "tan of 0",
:bucket :jvm-error,
:features [:host/jvm-interop]}
{:suite "clojure.math (jolt-h79)",
{:suite "clojure.math",
:label "to-radians",
:bucket :jvm-error,
:features [:host/jvm-interop]}
@ -91,11 +71,6 @@
:label "try multi-body last",
:bucket :jvm-error,
:features [:host/jvm-interop]}
{:suite
"conformance / native-op parity (compile emits janet ops at guarded arities)",
:label "native unary div",
:bucket :divergent,
:features [:numerics/double-only]}
{:suite "conformance / try / catch",
:label "ex-data",
:bucket :jvm-error,
@ -108,14 +83,6 @@
:label "try catch",
:bucket :jvm-error,
:features [:host/jvm-interop]}
{:suite "core / extenders",
:label "lists extended type",
:bucket :divergent,
:features [:host/jvm-interop]}
{:suite "core / extenders",
:label "seq of tags",
:bucket :divergent,
:features [:host/jvm-interop]}
{:suite "core / with-open",
:label "binding visible",
:bucket :jvm-error,
@ -124,10 +91,6 @@
:label "body result",
:bucket :jvm-error,
:features [:host/jvm-interop]}
{:suite "core / with-open",
:label "close on throw",
:bucket :divergent,
:features [:host/jvm-interop]}
{:suite "core / with-open",
:label "close runs",
:bucket :jvm-error,
@ -220,22 +183,6 @@
:label "global underive",
:bucket :jvm-error,
:features [:host/jvm-interop]}
{:suite "host-interop / bake env scrub",
:label "full snapshot filtered to the allowlist",
:bucket :jvm-error,
:features [:host/janet]}
{:suite "host-interop / bake env scrub",
:label "listed name still reads",
:bucket :jvm-error,
:features [:host/janet]}
{:suite "host-interop / bake env scrub",
:label "unlisted name reads nil under the allowlist",
:bucket :jvm-error,
:features [:host/janet]}
{:suite "host-interop / class tokens & readers",
:label "class name evaluates to canonical string",
:bucket :divergent,
:features [:host/jvm-interop]}
{:suite "host-interop / class tokens & readers",
:label "dispatch-only class name",
:bucket :jvm-error,
@ -256,10 +203,6 @@
:label "HashMap put + size",
:bucket :jvm-error,
:features [:host/jvm-interop]}
{:suite "host-interop / exception + HashMap shims",
:label "getMessage on a thrown string",
:bucket :divergent,
:features [:host/jvm-interop]}
{:suite "host-interop / migratus class shims",
:label "Timestamp is millis",
:bucket :jvm-error,
@ -332,10 +275,6 @@
:label "String/valueOf nil",
:bucket :jvm-error,
:features [:host/jvm-interop]}
{:suite "interop / StringReader & StringBuilder",
:label "line-seq over file reader",
:bucket :jvm-error,
:features [:host/janet]}
{:suite "interop / StringReader & StringBuilder",
:label "mark/reset",
:bucket :jvm-error,
@ -360,30 +299,6 @@
:label "method with args",
:bucket :jvm-error,
:features [:host/jvm-interop]}
{:suite "interop / janet bridge",
:label "janet.os/clock is a number",
:bucket :jvm-error,
:features [:host/janet]}
{:suite "interop / janet bridge",
:label "janet.string module fn",
:bucket :jvm-error,
:features [:host/janet]}
{:suite "interop / janet bridge",
:label "jolt vector crosses as a janet table",
:bucket :jvm-error,
:features [:host/janet]}
{:suite "interop / janet bridge",
:label "module fn janet.<mod>/<name>",
:bucket :jvm-error,
:features [:host/janet]}
{:suite "interop / janet bridge",
:label "root builtin janet/<name>",
:bucket :jvm-error,
:features [:host/janet]}
{:suite "interop / janet bridge",
:label "root builtin janet/type",
:bucket :jvm-error,
:features [:host/janet]}
{:suite "interop / java.time shims",
:label "Instant instance",
:bucket :jvm-error,
@ -424,30 +339,6 @@
:label "withLocale chain",
:bucket :jvm-error,
:features [:host/jvm-interop]}
{:suite "interop / jolt.interop",
:label "janet-type keyword",
:bucket :jvm-error,
:features [:host/janet]}
{:suite "interop / jolt.interop",
:label "janet-type list",
:bucket :jvm-error,
:features [:host/janet]}
{:suite "interop / jolt.interop",
:label "janet-type number",
:bucket :jvm-error,
:features [:host/janet]}
{:suite "interop / jolt.interop",
:label "janet-type quoted list",
:bucket :jvm-error,
:features [:host/janet]}
{:suite "interop / jolt.interop",
:label "janet-type string",
:bucket :jvm-error,
:features [:host/janet]}
{:suite "io / *in* + with-in-str + read-line",
:label "*in* is bound",
:bucket :divergent,
:features [:host/jvm-interop]}
{:suite "io / cold tagged types via print-method",
:label "atom override fires nested",
:bucket :divergent,
@ -480,18 +371,6 @@
:label "StringWriter accumulates",
:bucket :jvm-error,
:features [:host/jvm-interop]}
{:suite "io / print-method multimethod",
:label "defmethod fires nested in a map",
:bucket :divergent,
:features [:reader/jolt]}
{:suite "io / print-method multimethod",
:label "defmethod fires through prn",
:bucket :divergent,
:features [:printer/jolt]}
{:suite "io / print-method multimethod",
:label "defmethod overrides a record, top level",
:bucket :divergent,
:features [:printer/jolt]}
{:suite "io / print-method multimethod",
:label "direct builtin override",
:bucket :jvm-error,
@ -507,7 +386,7 @@
{:suite "io / slurp, spit, printf, flush (host-classified)",
:label "file-seq finds files",
:bucket :jvm-error,
:features [:host/janet]}
:features [:host/jvm-interop]}
{:suite "macros / core-overlay",
:label "assert message",
:bucket :jvm-error,
@ -520,22 +399,10 @@
:label "condp no match",
:bucket :jvm-error,
:features [:host/jvm-interop]}
{:suite "macros / defmacro",
:label "macroexpand-1",
:bucket :divergent,
:features [:impl/representation]}
{:suite "macros / time, with-redefs, macroexpand",
:label "with-redefs restores on throw",
:bucket :jvm-error,
:features [:host/jvm-interop]}
{:suite "maps / literal construction",
:label "source order through syntax-quote",
:bucket :divergent,
:features [:reader/jolt]}
{:suite "metadata / def metadata",
:label "^Type tag on var",
:bucket :divergent,
:features [:host/jvm-interop]}
{:suite "metadata / type hints",
:label "symbol hint -> :tag",
:bucket :divergent,
@ -568,42 +435,6 @@
:label "require :as registers the alias",
:bucket :jvm-error,
:features [:host/jvm-interop]}
{:suite "numbers / arithmetic",
:label "divide to fraction",
:bucket :divergent,
:features [:numerics/double-only]}
{:suite "numbers / literal syntax",
:label "bigdec int M",
:bucket :divergent,
:features [:numerics/double-only]}
{:suite "numbers / literal syntax",
:label "bigdec suffix M",
:bucket :divergent,
:features [:numerics/double-only]}
{:suite "numbers / literal syntax",
:label "neg ratio",
:bucket :divergent,
:features [:numerics/double-only]}
{:suite "numbers / literal syntax",
:label "ratio -> double",
:bucket :divergent,
:features [:numerics/double-only]}
{:suite "numbers / literal syntax",
:label "ratio 3/4",
:bucket :divergent,
:features [:numerics/double-only]}
{:suite "numbers / printing of inf & nan",
:label "inf inside coll",
:bucket :divergent,
:features [:numerics/double-only]}
{:suite "numbers / printing of inf & nan",
:label "pr-str Infinity",
:bucket :divergent,
:features [:numerics/double-only]}
{:suite "predicates / compare, type, any? (stage 3)",
:label "type of record",
:bucket :divergent,
:features [:host/jvm-interop]}
{:suite "predicates / overlay-migrated",
:label "keyword-identical?",
:bucket :jvm-error,
@ -620,54 +451,14 @@
:label "undefined?",
:bucket :jvm-error,
:features [:host/jvm-interop]}
{:suite "predicates / tagged-value (Phase 4)",
{:suite "predicates / tagged-value",
:label "atom? no",
:bucket :jvm-error,
:features [:host/jvm-interop]}
{:suite "predicates / tagged-value (Phase 4)",
{:suite "predicates / tagged-value",
:label "atom? yes",
:bucket :jvm-error,
:features [:host/jvm-interop]}
{:suite "predicates / tagged-value (Phase 4)",
:label "chunked-seq? always false",
:bucket :divergent,
:features [:host/jvm-interop]}
{:suite "reader / dispatch & sugar",
:label "reader cond :jolt",
:bucket :divergent,
:features [:reader/jolt]}
{:suite "reader / dispatch & sugar",
:label "reader cond no match",
:bucket :divergent,
:features [:reader/jolt]}
{:suite "reader / dispatch & sugar",
:label "reader cond splice",
:bucket :divergent,
:features [:reader/jolt]}
{:suite "reader / dispatch & sugar",
:label "reader cond splice no match",
:bucket :divergent,
:features [:reader/jolt]}
{:suite "reader / dispatch & sugar",
:label "reader conditional",
:bucket :divergent,
:features [:reader/jolt]}
{:suite "reader / scalar literals",
:label "bigdec suffix M",
:bucket :divergent,
:features [:numerics/double-only]}
{:suite "reader / scalar literals",
:label "ratio -> double",
:bucket :divergent,
:features [:numerics/double-only]}
{:suite "reader / syntax-quote literal collapse (spec 2.4 S25)",
:label "bool nested",
:bucket :divergent,
:features [:reader/jolt]}
{:suite "reader / syntax-quote literal collapse (spec 2.4 S25)",
:label "nil nested",
:bucket :divergent,
:features [:reader/jolt]}
{:suite "regex / Pattern statics & String regex methods",
:label "Pattern/MULTILINE ^",
:bucket :jvm-error,
@ -708,19 +499,19 @@
:label "re-pattern is regex?",
:bucket :jvm-error,
:features [:host/jvm-interop]}
{:suite "set / nil element (jolt-bn2p)",
{:suite "set / nil element",
:label "transient conj! nil",
:bucket :jvm-error,
:features [:host/jvm-interop]}
{:suite "set / nil element (jolt-bn2p)",
{:suite "set / nil element",
:label "transient contains? nil",
:bucket :jvm-error,
:features [:host/jvm-interop]}
{:suite "set / nil element (jolt-bn2p)",
{:suite "set / nil element",
:label "transient disj! nil cnt",
:bucket :jvm-error,
:features [:host/jvm-interop]}
{:suite "set / nil element (jolt-bn2p)",
{:suite "set / nil element",
:label "transient disj! removes",
:bucket :jvm-error,
:features [:host/jvm-interop]}
@ -744,14 +535,6 @@
:label "sorted-set? true",
:bucket :jvm-error,
:features [:host/jvm-interop]}
{:suite "state / agents (synchronous shim)",
:label "send applies",
:bucket :divergent,
:features [:concurrency/snapshot]}
{:suite "state / agents (synchronous shim)",
:label "send-off applies",
:bucket :divergent,
:features [:concurrency/snapshot]}
{:suite "state / atoms",
:label "atom? on non-atom",
:bucket :jvm-error,
@ -764,14 +547,6 @@
:label "promise undelivered",
:bucket :timeout,
:features [:perf/unbounded]}
{:suite "transient / assoc! odd args throw",
:label "map dangling key",
:bucket :throws-mismatch,
:features [:strictness/jolt]}
{:suite "transient / assoc! odd args throw",
:label "vector dangling",
:bucket :throws-mismatch,
:features [:strictness/jolt]}
{:suite "transient / set",
:label "conj! dedups",
:bucket :jvm-error,
@ -804,22 +579,6 @@
:label "bean is the map",
:bucket :divergent,
:features [:host/jvm-interop]}
{:suite "untested / JVM-shape stubs (documented jolt behavior)",
:label "class keyword",
:bucket :divergent,
:features [:host/jvm-interop]}
{:suite "untested / JVM-shape stubs (documented jolt behavior)",
:label "class number",
:bucket :divergent,
:features [:host/jvm-interop]}
{:suite "untested / JVM-shape stubs (documented jolt behavior)",
:label "class string",
:bucket :divergent,
:features [:host/jvm-interop]}
{:suite "untested / JVM-shape stubs (documented jolt behavior)",
:label "definterface defines",
:bucket :divergent,
:features [:host/jvm-interop]}
{:suite "untested / JVM-shape stubs (documented jolt behavior)",
:label "enumeration-seq",
:bucket :jvm-error,
@ -848,10 +607,6 @@
:label "update-proxy",
:bucket :jvm-error,
:features [:host/jvm-interop]}
{:suite "untested / array stubs (vectors + host buffers)",
:label "aclone vec",
:bucket :jvm-error,
:features [:host/arrays]}
{:suite "untested / array stubs (vectors + host buffers)",
:label "aset-boolean",
:bucket :jvm-error,
@ -884,58 +639,10 @@
:label "aset-short",
:bucket :jvm-error,
:features [:host/arrays]}
{:suite "untested / array stubs (vectors + host buffers)",
:label "boolean-array",
:bucket :divergent,
:features [:host/jvm-interop]}
{:suite "untested / array stubs (vectors + host buffers)",
:label "double-array",
:bucket :divergent,
:features [:host/jvm-interop]}
{:suite "untested / array stubs (vectors + host buffers)",
:label "float-array",
:bucket :divergent,
:features [:host/jvm-interop]}
{:suite "untested / array stubs (vectors + host buffers)",
:label "int-array",
:bucket :divergent,
:features [:host/jvm-interop]}
{:suite "untested / array stubs (vectors + host buffers)",
:label "into-array",
:bucket :divergent,
:features [:host/jvm-interop]}
{:suite "untested / array stubs (vectors + host buffers)",
:label "long-array",
:bucket :divergent,
:features [:host/jvm-interop]}
{:suite "untested / array stubs (vectors + host buffers)",
:label "make-array",
:bucket :jvm-error,
:features [:host/arrays]}
{:suite "untested / array stubs (vectors + host buffers)",
:label "short-array",
:bucket :divergent,
:features [:host/jvm-interop]}
{:suite "untested / array stubs (vectors + host buffers)",
:label "to-array",
:bucket :divergent,
:features [:host/jvm-interop]}
{:suite "untested / chunk family (eager equivalents) + cat",
:label "chunk round-trip",
:bucket :divergent,
:features [:host/jvm-interop]}
{:suite "untested / ns + REPL machinery",
:label "*in* bound",
:bucket :divergent,
:features [:host/jvm-interop]}
{:suite "untested / ns + REPL machinery",
:label "ns-imports empty user",
:bucket :divergent,
:features [:host/jvm-interop]}
{:suite "untested / primed + division + bit ops",
:label "/ ratio-as-double",
:bucket :divergent,
:features [:numerics/double-only]}
{:suite "untested / protocols: extend + extends?",
:label "extend registers",
:bucket :jvm-error,
@ -964,22 +671,6 @@
:label "chars first",
:bucket :jvm-error,
:features [:host/jvm-interop]}
{:suite "untested / typed coercion views",
:label "double",
:bucket :divergent,
:features [:numerics/double-only]}
{:suite "untested / typed coercion views",
:label "doubles",
:bucket :jvm-error,
:features [:host/jvm-interop]}
{:suite "untested / typed coercion views",
:label "float",
:bucket :divergent,
:features [:numerics/double-only]}
{:suite "untested / typed coercion views",
:label "floats",
:bucket :jvm-error,
:features [:host/jvm-interop]}
{:suite "untested / typed coercion views",
:label "ints",
:bucket :jvm-error,
@ -991,16 +682,4 @@
{:suite "untested / typed coercion views",
:label "shorts",
:bucket :jvm-error,
:features [:host/jvm-interop]}
{:suite "untested / unchecked-* are plain ops",
:label "unchecked-char",
:bucket :divergent,
:features [:host/jvm-interop]}
{:suite "untested / unchecked-* are plain ops",
:label "unchecked-double",
:bucket :divergent,
:features [:numerics/double-only]}
{:suite "untested / unchecked-* are plain ops",
:label "unchecked-float",
:bucket :divergent,
:features [:numerics/double-only]}]}
:features [:host/jvm-interop]}]}

View file

@ -43,7 +43,7 @@
(clojure.core/refer-clojure)
;; make the stdlib namespaces a corpus case may reference by qualified name
;; resolvable (clojure.math/floor etc.) so they evaluate to the real JVM
;; value instead of throwing Unable-to-resolve (-> kept Janet value).
;; value instead of throwing Unable-to-resolve (-> existing :expected kept).
(doseq [n '[clojure.string clojure.set clojure.walk clojure.edn
clojure.math clojure.pprint]]
(try (require n) (catch Throwable _ nil)))