         t (arithmetic-type a b)]
     (if t
       (assoc (ast/term :* a b) :type t)
-      (throw (js/Error. (str "Arguments to * must have type :int or :float"))))))
+      (throw (js/Error. (str "Arguments to * must have type :int or :float, given " (pr-str (:type a)) " and " (pr-str (:type b))))))))
 
 (defn div [a b]
   (let [a (ensure-term a)

        t (arithmetic-type a b)]
    (if t
      (assoc (ast/term :+ a b) :type t)
      (throw (js/Error. (str "Arguments to + must have type :int or :float"))))))

(defn - [a b]
  (let [a (ensure-term a)

        t (arithmetic-type a b)]
    (if t
      (assoc (ast/term :- a b) :type t)
      (throw (js/Error. (str "Arguments to - must have type :int or :float, given " (pr-str (:type a)) " and " (pr-str (:type b))))))))

(defn * [a b]
  (let [a (ensure-term a)
