Add bigdec min/max (review follow-up)
Review found (< 1M 2M) worked but (min 1M 2M) threw — incoherent. Wire min/max the same way as the other ops: value-position jolt-min/jolt-max shims (new in seq.ss, added to core-value-procs) and call-position via bd-spec/bd-ops -> jbd-min/jbd-max. min/max return the original operand by value, not a coerced copy, matching Clojure: (min 1M 2.0) -> 1M, (max 1M 2.0) -> 2.0, (min 1.50M 2M) -> 1.50M; a tie keeps the second operand ((max 1.5M 1.50M) -> 1.50M). bigdec mixed with a flonum in call position stays in the documented :any/contagion gap (value position handles it). Re-mint; 6 more JVM-certified rows.
This commit is contained in:
parent
6fcc9fa8e6
commit
09a9ad8c75
7 changed files with 207 additions and 178 deletions
|
|
@ -42,7 +42,8 @@
|
|||
;; EXACT results for exact/zero-arg inputs, breaking the all-double model in
|
||||
;; higher-order use, so value-position arithmetic routes to the flonum wrappers.
|
||||
(def ^:private core-value-procs
|
||||
(merge native-ops {"+" "jolt-add" "-" "jolt-sub" "*" "jolt-mul" "/" "jolt-div"}))
|
||||
(merge native-ops {"+" "jolt-add" "-" "jolt-sub" "*" "jolt-mul" "/" "jolt-div"
|
||||
"min" "jolt-min" "max" "jolt-max"}))
|
||||
|
||||
;; Per-op arity gate: only lower when the Scheme prim and the jolt fn agree at
|
||||
;; this arity. Ops absent from the table are variadic (legal at any arity).
|
||||
|
|
@ -101,6 +102,7 @@
|
|||
;; flonum path no literal rewrite is needed.
|
||||
(def ^:private bd-ops
|
||||
{"+" "jbd-add" "-" "jbd-sub" "*" "jbd-mul" "/" "jbd-div"
|
||||
"min" "jbd-min" "max" "jbd-max"
|
||||
"quot" "jbd-quot" "rem" "jbd-rem"
|
||||
"<" "jbd-lt?" ">" "jbd-gt?" "<=" "jbd-le?" ">=" "jbd-ge?"
|
||||
"zero?" "jbd-zero?" "pos?" "jbd-pos?" "neg?" "jbd-neg?"})
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@
|
|||
;; still a bigdec op. Each non-nil name must have an entry in backend bd-ops.
|
||||
(defn- bd-spec [nm n]
|
||||
(cond
|
||||
(and (>= n 1) (contains? #{"+" "-" "*" "/"} nm)) :bigdec
|
||||
(and (>= n 1) (contains? #{"+" "-" "*" "/" "min" "max"} nm)) :bigdec
|
||||
(and (= n 2) (contains? #{"quot" "rem"} nm)) :bigdec
|
||||
(and (= n 1) (contains? #{"zero?" "pos?" "neg?"} nm)) :bool
|
||||
(and (>= n 2) (contains? #{"<" ">" "<=" ">="} nm)) :bool
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue