Thanks much. On Mon, Jan 19, 2009 at 11:03 AM, Michael Reid <kid.me...@gmail.com> wrote:
> > On Fri, Jan 16, 2009 at 9:57 PM, David Nolen <dnolen.li...@gmail.com> > wrote: > > Just made sense to me today as well. > > #^Class > > is short form for saying set the metadata for the symbol being defined > (in > > this case list) to the map {:tag Class}. > > #^ is a reader macro for setting metadata for the compiler. That code is > > simple tagging the symbol clojure/list. > > (meta #'list) > > will give you the map representing the metadata. :tag is used by the > > compiler, but it's not clear to me in what cases... > > > > The most common case where :tag is used by the compiler is to generate > direct method calls into Java code rather than using reflection to do > the call, which is much slower, e.g: > > (defn index-of [s substr] > (.indexOf s substr)) > > The call to String.indexOf will likely be compiled as a reflective > call because in the general case, the compiler doesn't know that 's' > and 'substr' are meant to be instances of java.lang.String. If however > you add a couple of type hints: > > (defn index-of [#^String s #^String substr] > (.indexOf s substr)) > > Then the compiler will generate an optimized code path that directly > invokes String.indexOf(String,String), and the other which will fall > back to the reflective invocation. The reason that two code paths are > needed is because Clojure is dynamically typed. Therefore it is > perfectly legal to pass in any type of objects as the parameter in > which case you want the call to .indexOf to succeed if the passed in > instance does in fact have a method named indexOf that can accept > 'substr' as its argument. > > To see where the compiler needs to help you can use the > *warn-on-reflection* flag to ask for warnings where the compiler can't > resolve the calls. See: > > http://clojure.org/java_interop#toc35 > > for example usage. > > /mike. > > > > --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---