On Jan 2, 2012 11:43 AM, "Sam Ritchie" <sritchi...@gmail.com> wrote: > > You're right, it's macro more than inlining. Tag metadata doesn't throw an error, but it doesn't fix the reflection warning either (assuming I'm doing it correctly): > > (defmacro barr= [^{:tag bytes} x ^{:tag bytes} y] > `(java.util.Arrays/equals ~x ~y)) > > (defmacro barr= [ x y] > `(java.util.Arrays/equals ^{:tag bytes} ~x > ^{:tag bytes} ~y)) >
The pevious macro is incorrectly written. > As for the approach, I wanted to start out by mimicking the implementation of clojure.core/=. I haven't written inlined functions before, and was curious about the potential speedup. I do like the idea of a generic arr=. > > On Mon, Jan 2, 2012 at 11:27 AM, David Nolen <dnolen.li...@gmail.com> wrote: >> >> I suspect this has more to do with type-hinting inside a macro. Did you try adding :tag metadata to those symbols? >> >> As a side note I do find this approach a bit strange. Why not just define a generic arr= that with multi-arity inlining? >> >> David >> >> On Mon, Jan 2, 2012 at 1:43 PM, Sam Ritchie <sritchi...@gmail.com> wrote: >>> >>> Hey all, >>> >>> I'm writing a function called barr= that looks just like clojure.core/=, but uses java.util.Arrays/equals instead of equiv. To speed up the function I tried adding type hints to both the function definition and the 2-argument inlined version. Type hinting the inline function threw an exception that makes me think the compiler is interpreting Here's the gist: https://gist.github.com/1551640 >>> >>> Type hints on the function definition work great: >>> >>> (defn barr= >>> ([x] true) >>> ([^bytes x ^bytes y] >>> (java.util.Arrays/equals x y)) >>> ([x y & more] >>> (if (barr= x y) >>> (if (next more) >>> (recur y (first more) (next more)) >>> (barr= y (first more))) >>> false))) >>> >>> But hinting the inline version causes an exception: >>> >>> (defn barr= >>> {:inline-arities #{2} >>> :inline (fn [x y] `(let [^bytes x# ~x >>> ^bytes y# ~y] >>> (java.util.Arrays/equals x# y#)))} >>> ([x] true) >>> ([^bytes x ^bytes y] >>> (java.util.Arrays/equals x y)) >>> ([x y & more] >>> (if (barr= x y) >>> (if (next more) >>> (recur y (first more) (next more)) >>> (barr= y (first more))) >>> false))) >>> >>> ;; CompilerException java.lang.IllegalArgumentException: Unable to resolve classname: >>> ;; clojure.core/bytes, compiling:(NO_SOURCE_PATH:54) >>> >>> The compiler seems to be interpreting this type hint as a var. Are type hints not allowed inside of inline definitions for some reason? >>> >>> Cheers, >>> -- >>> Sam Ritchie, Twitter Inc >>> 703.662.1337 >>> @sritchie09 >>> >>> (Too brief? Here's why! http://emailcharter.org) >>> >>> -- >>> 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 >>> Note that posts from new members are moderated - please be patient with your first post. >>> 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 >> >> >> -- >> 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 >> Note that posts from new members are moderated - please be patient with your first post. >> 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 > > > > > -- > Sam Ritchie, Twitter Inc > 703.662.1337 > @sritchie09 > > (Too brief? Here's why! http://emailcharter.org) > > -- > 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 > Note that posts from new members are moderated - please be patient with your first post. > 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 -- 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 Note that posts from new members are moderated - please be patient with your first post. 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