In the code I posted the let evaluated rem before checking the
arguments.
It would be better arranged like so:

(defn mod2
  "Modulus of num and div. Truncates toward negative infinity."
  [num div]
  (if (or (not (integer? num)) (not (integer? div)))
    (throw (IllegalArgumentException. "mod requires two integers"))
    (let [m (rem num div)]
      (if (and
            (not (zero? m))
            (or (< num 0 div) (< div 0 num)))
        (+ m div)
        m))))

Same behavior:

user=> (map #(mod2 % 3) (range -9 9))
(0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2)
user=> (map #(mod2 % -3) (range -9 9))
(0 -2 -1 0 -2 -1 0 -2 -1 0 -2 -1 0 -2 -1 0 -2 -1)

I'm sure there are better ways still, just wanted to correct my
mistake.


Regards,
Tim.


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To post to this group, send email to clojure@googlegroups.com
To unsubscribe from this group, send email to 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to