Unchecked / *unchecked-math* arithmetic wraps to signed 64-bit
clojure.core's unchecked-* (and +/-/*/inc/dec under *unchecked-math*) are long
ops that WRAP on overflow; jolt's checked arithmetic is arbitrary-precision and
its unchecked-* were plain non-wrapping (+ x y), diverging from the JVM. Now they
truncate to the low 64 bits as a signed long, matching Clojure:
(unchecked-add 9223372036854775807 1) => -9223372036854775808
(unchecked-multiply 9223372036854775807 …) => 1
- host/chez/seq.ss: jolt-wrap64 + binary jolt-unc{add,sub,mul,inc,dec,neg}2 and
the variadic clojure.core/unchecked-* fns (def-var!'d in natives-seq.ss, where
def-var! is bound). The overlay's plain unchecked-* defns are removed.
- backend lng-ops: unchecked-+/-/* emit the wrapping jolt-unc* helpers (the
raising fx ops can't wrap on Chez's 61-bit fixnums); unchecked-inc/dec too.
- *unchecked-math* is honored: the analyzer reads it (jolt.host/unchecked-math?)
and rewrites +/-/*/inc/dec to their unchecked-* for the rest of a file that
(set!)s it, like the JVM.
- jolt->fx: a ^long value that overflows the 61-bit fixnum range passes through
as an exact integer instead of erroring (a full-width long from wrapping math).
Also adds Long/bitCount / numberOfLeadingZeros / reverse and Math/getExponent /
scalb (test.check's splittable PRNG uses them).
This lets clojure.test.check load and run quick-check on jolt. re-mint (analyzer/
backend/overlay are seed sources). make test green (+6 corpus rows, 0 new
divergences, numeric gate updated), shakesmoke byte-identical.
This commit is contained in:
parent
86dd9650b6
commit
a028cab04f
12 changed files with 588 additions and 517 deletions
|
|
@ -80,6 +80,12 @@
|
|||
(define (hc-var-value-ns x) (var-cell-ns x))
|
||||
(define (hc-var-value-name x) (var-cell-name x))
|
||||
|
||||
;; *unchecked-math* read at compile time: when truthy (a file's (set!
|
||||
;; *unchecked-math* …)), the analyzer rewrites +/-/*/inc/dec to their wrapping
|
||||
;; unchecked-* forms for the rest of that file, like the JVM.
|
||||
(define (hc-unchecked-math?)
|
||||
(jolt-truthy? (guard (e (#t #f)) (var-deref "clojure.core" "*unchecked-math*"))))
|
||||
|
||||
;; --- form accessors ---------------------------------------------------------
|
||||
(define (hc-char-code x) (char->integer x)) ; native Chez char -> codepoint
|
||||
(define (hc-sym-name x) (symbol-t-name x))
|
||||
|
|
@ -471,6 +477,7 @@
|
|||
(def-var! "jolt.host" "form-var-value?" hc-var-value?)
|
||||
(def-var! "jolt.host" "form-var-value-ns" hc-var-value-ns)
|
||||
(def-var! "jolt.host" "form-var-value-name" hc-var-value-name)
|
||||
(def-var! "jolt.host" "unchecked-math?" hc-unchecked-math?)
|
||||
(def-var! "jolt.host" "form-bigdec?" hc-bigdec?)
|
||||
(def-var! "jolt.host" "form-bigdec-source" hc-bigdec-source)
|
||||
(def-var! "jolt.host" "form-elements" hc-elements)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue