On Fri, Jun 19, 2009 at 11:40 AM, tmountain<tinymount...@gmail.com> wrote:
>
> It looks like Clojure auto-boxes from long to Long by default:
>
> user=> (type (long 3))
> java.lang.Long

Right.

> If you want to type hint something to primitive long you'd use #^long.
> For object long, use #^Long. Be warned that I'm still new at this, so
> I could be wrong.

Thanks for giving it a shot, but that's not quite right.
There's no way to use the hinting syntax (that is, the :tag
metadata) to indicate something is a primitive.  Hinting
itself implies an Object of some class.

However Clojure can work with primitives -- the one place
where a primitive can be stored is in a local (not an
argument, not a parameter, not a return value).

  (defn foo [x]
    (let [y (int x)]
      ...))

There x is a parameter, and therefore refers to some kind of
Object.  But the local y is bound to (int x), which the
compiler can see is always a primitive int, therefore it
will make y a primitive int.

It can be hard to distinguish between a primitive local and
an Object local -- Clojure does what it can to treat them
similarly.  But there are a few clues, for example trying to
type hint (which implies Object) a primitive (which cannot
be an Object) is clearly wrong:

  (let [x (int 5)]
    (.shortValue #^Integer x)) ; not right

java.lang.UnsupportedOperationException: Can't type hint a primitive
local (NO_SOURCE_FILE:70)

Of course if x were not a primitive, it'd be quite alright:

  (let [x 5]
    (.shortValue #^Integer x)) ; fine

There's little thing in contrib to help you see what the
Clojure compiler knows about a particular expression:

  (use '[clojure.contrib.repl-utils :only [expression-info]])

  (expression-info '(let [x 5] x))
  ==> {:class java.lang.Integer, :primitive? false}

  (expression-info '(let [x 5] (.shortValue #^Integer x)))
  ==> {:class short, :primitive? true}

  (expression-info '(let [x 5] x))
  ==> {:class java.lang.Integer, :primitive? false}

Hope that helps,
--Chouser

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