When unchecked-add is given an invalid argument, sometimes it throws  
an exception, and sometimes it does something very weird -- it returns  
the code for the call!

Referring to the files foo1.clj and foo2.clj below, if I type at the  
REPL

  (use 'com.ksvanhorn.foo2)

I get "java.lang.IllegalArgumentException: No matching method found:  
unchecked_add (foo2.clj:0)", which is unsurprising, as (* magic x) is  
much too large to fit into an int.

However, if I type

  (use 'com.ksvanhorn.foo1)

I get "v: (clojure.core/unchecked-add 1 9948446125717)" printed out  
and nil returned, with no exception thrown.

The only difference between foo1.clj and foo2.clj is that foo1.clj  
uses a macro defined within a let.  If I replace the macro call with  
its expansion, or if I define the macro outside of the let, then I get  
the same behavior as for foo2.clj.

--- BEGIN foo1.clj ---
(ns com.ksvanhorn.foo1)

(let [dummy 0]
  (defmacro add [& args] `(unchecked-add ~...@args))
  (let [magic 1812433253
        x 5489
        v (add 1 (* magic x))]
      (println (str "v: " v))))
--- END ---

--- BEGIN foo2.clj ---
(ns com.ksvanhorn.foo2)

(let [magic 1812433253
      x 5489
      v (unchecked-add 1 (* magic x))]
  (println (str "v: " v))))
--- END ---


--~--~---------~--~----~------------~-------~--~----~
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