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

Reply via email to