From f7928af3e8c28378296e05d5ab44681c5d1f5644 Mon Sep 17 00:00:00 2001 From: Yogthos Date: Fri, 5 Jun 2026 14:07:41 -0400 Subject: [PATCH] =?UTF-8?q?docs:=20update=20conformance=20note=20=E2=80=94?= =?UTF-8?q?=20Jolt=20now=20validates=20args=20like=20Clojure?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Strictness work brought the suite to ~3900 passing; the leniency divergence is largely gone. Remaining failures are bignum/ratio/bigdec, integer/float identity, 64-bit/Unicode, eager-vector seqs, and the map-entry-as-2-vector case. --- README.md | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 2efba24..5e870b1 100644 --- a/README.md +++ b/README.md @@ -119,9 +119,11 @@ exercises it. ### clojure-test-suite conformance The [clojure-test-suite](https://github.com/lread/clojure-test-suite) battery -runs ~3700 assertions green. The assertions that remain failing are all -accounted for by the platform/design differences above, not by missing -behavior: +runs ~3900 assertions green. Jolt validates its arguments like Clojure — +arithmetic on non-numbers, comparisons against `nil`, out-of-range indices, +malformed `conj!`/`assoc!`/`merge`, and non-seqable `first`/`seq`/`vec` all +throw. The assertions that remain failing are accounted for by the +platform/design differences above, not by missing behavior: - **No bignum/ratio/BigDecimal** — `bigint`/`numerator`/`denominator`/`bigdec`, the `big-int?`/auto-promotion checks, and the `2N`/`1/2`/`1.0M` literals read @@ -131,11 +133,10 @@ behavior: `float?`/`double?` cases can't distinguish them (`(str 0.0)` is `"0"`). - **64-bit integers / Unicode** — `bit-and` etc. on full-width 64-bit constants lose precision (doubles), and `subs`/`count` work on bytes, not code points. -- **Leniency** — where Clojure throws on a malformed call (bad-shape `conj!`, - arithmetic on non-numbers, out-of-range indices), Jolt is mostly permissive, - so the suite's `thrown?` assertions for those don't fire. - **Eager seqs** — `map`/`filter`/`range` return vectors, so `seq?`/`vector?`/ `sequential?` of their results differ, and sorts aren't guaranteed stable. +- **Map entries** — a map entry is an ordinary 2-vector, so `key`/`val` accept + any 2-vector and a few `thrown?` cases for non-entries don't fire. ## License