Just use ^ for type hints. http://clojure.org/java_interop#Java%20Interop-Type%20Hints
Type hints are used to eliminate reflection calls, the compiler can use the exact type of the parameter to eliminate the runtime cost of finding if methods/fields exist before calling/accessing them. user=> (set! *warn-on-reflection* true) true ;;; <== tells the compiler to complain about reflection calls user=> (defn a [b] (.startsWith b "a")) Reflection warning, NO_SOURCE_PATH:23 - call to startsWith can't be resolved. <=== Oups ! #'user/a user=> (a 1) java.lang.IllegalArgumentException: No matching method found: startsWith for class java.lang.Integer (NO_SOURCE_FILE:0) This definition has no type hint, the compiler flags a warning to say that it cannot resolve the method startsWith. If you try to call the first form with an object not implementing startsWith, the runtime traps that it did not find the method on that object's class. The flexibility comes with a cost, finding the method on the fly. user=> (defn a [^String b] (.startsWith b "a")) #'user/a user=> (a 1) java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String (NO_SOURCE_FILE:0) Here the compilation does not trigger the reflection warning, the argument type has been hinted as a string. The compiler can find the method immediately and generate the code without any runtime "search". At runtime, if you ever call the second form with a non string object, this time you get that the argument type is not the one expected (from the type hint). The compiler has added a type check instead of relying on the dynamic search for methods/fields in the class which is faster. Note that it's not data typing per se. You are allowed to call the form with a different object class. The compiler will not scream, the runtime will if you persists to call the method. Form #1 allows you to pass objects of any class that implements startsWith with a small loss of performance. In form #2 you can gain performance at the expense of generality. Type hints are to be to improve performance AFTER your code is more or less stable. If you use type hints early in your development, you will carry them all the way and that can be a significant pain. Luc P. On Wed, 19 Oct 2011 22:03:31 -0700 (PDT) mmwaikar <mmwai...@gmail.com> wrote: > Hi, > > I read in "Clojure in Action" book by Amit Rathore, that #^ > associates metadata for the next form. He also mentions that it is > deprecated. So what is the current way of doing it? > > Also, in code like this - > > (defn filenames-in-jar > "Returns a sequence of Strings naming the non-directory entries in > the JAR file." > [#^JarFile jar-file] > > is it specifying that the type of the jar-file argument should be > JarFile? > > Where can I find some more documentation and or examples about it? > > Thanks, > Manoj. > -- Luc P. ================ The rabid Muppet -- 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