Chez inc 3m: numeric-edge literal emit + variadic assoc!

##Inf/##-Inf/##NaN were emitted to bare inf/-inf/nan, which are unbound symbols in
Chez. emit-const now lowers them to +inf.0/-inf.0/+nan.0. The -e/element printer
renders them inf/-inf/nan (Chez's number->string gives +inf.0), and str renders the
long Clojure forms Infinity/-Infinity/NaN. assoc! is now variadic ((assoc! t k v
& kvs)) like Clojure.

Prelude parity 1382 -> 1407/2497, 0 new divergences. str of inf INSIDE a collection
still wants the long form (needs the Phase-2 recursive str renderer), so
[inf inside coll] is allowlisted. Transducer arities and the cdr-on-()/\p{} regex
gaps are split out to jolt-kxsr/jolt-y1zq.
This commit is contained in:
Yogthos 2026-06-17 22:32:02 -04:00
parent 1826c8b3e9
commit c28b5406ca
7 changed files with 65 additions and 16 deletions

View file

@ -98,9 +98,15 @@
;; jolt models every number as a Clojure double: integer-valued values print
;; without a ".0" (the Janet host prints (* 1.0 5) as "5", (/ 1 2) as "0.5").
(define (jolt-num->string x)
(if (and (rational? x) (integer? x))
(number->string (exact x))
(number->string x)))
(cond
;; the -e / element printer renders the infinities and NaN as inf/-inf/nan
;; (Chez's number->string gives +inf.0 etc.); the str/print family uses the
;; long "Infinity"/"NaN" forms (see jolt-str-render-one in converters.ss).
((and (flonum? x) (fl= x +inf.0)) "inf")
((and (flonum? x) (fl= x -inf.0)) "-inf")
((and (flonum? x) (not (fl= x x))) "nan")
((and (rational? x) (integer? x)) (number->string (exact x)))
(else (number->string x))))
;; Program-final-value printer. jolt's `-e` prints in str-style: strings raw (no
;; quotes), chars as `\c`/`\newline`, collections recursively. NOTE: maps/sets