diff --git a/jolt-core/jolt/analyzer.clj b/jolt-core/jolt/analyzer.clj index e1d8d6b..0a1ead9 100644 --- a/jolt-core/jolt/analyzer.clj +++ b/jolt-core/jolt/analyzer.clj @@ -18,7 +18,7 @@ def-node let-node fn-node vector-node map-node set-node quote-node throw-node host-static host-new]] [jolt.host :refer [form-sym? form-sym-name form-sym-ns form-list? - form-vec? form-map? form-set? form-char? + form-vec? form-map? form-set? form-literal? form-keyword? form-elements form-vec-items form-map-pairs form-set-items form-special? compile-ns form-regex? form-regex-source diff --git a/jolt-core/jolt/passes/numeric.clj b/jolt-core/jolt/passes/numeric.clj index 7eb3e96..9f6e732 100644 --- a/jolt-core/jolt/passes/numeric.clj +++ b/jolt-core/jolt/passes/numeric.clj @@ -127,7 +127,13 @@ pe (reduce (fn [e p] (assoc e p (get nh p))) tenv (get a :params))] (if (get a :rest) (assoc pe (get a :rest) nil) pe))) -(defn- an-invoke [node tenv] +(defn- an-invoke + "Annotate an :invoke with its numeric kind. An arithmetic core op specializes to + the Chez fl*/fx* op only when every operand is the same kind (:double or :long), + except an integer literal is :wild — valid in either — so (+ ^double x 2) stays + double. A call to a ^double/^long-returning var yields that kind without lowering + the call (its body already coerces the return)." + [node tenv] (let [fnode (get node :fn) nm (when (and (= :var (get fnode :op)) (= "clojure.core" (get fnode :ns))) (get fnode :name))