On Thu, Oct 20, 2011 at 12:45 PM, nathanmarz <nathan.m...@gmail.com> wrote:
> But Clojure is already inconsistent. ints and Integers in interop are
> treated differently. The only way to make Clojure consistent is to
> either:

as David said "Clojure now only has 64bit primitives".

an Integer is not a primitive, an int is.

>
> 1. Box ints as Integers
> 2. Always convert Integers to Longs.
>
> I'm not sure on the feasibility of #2.
>
> I'm not trying to be obtuse, but I really don't see the benefit of
> boxing primitive ints as Longs given how Integer objects are treated.
> Right now, if you obtain an Integer object via interop and want it to
> be compatible with Clojure's regular numerics, you still have to
> manually convert that Integer object into a Long. What I'm proposing
> is that you treat primitive ints obtained via interop the exact same
> way, which avoids the weird type issues that I ran into.
>
> -Nathan
>
>
> On Oct 20, 12:26 pm, David Nolen <dnolen.li...@gmail.com> wrote:
>> Such a change would be make Clojure's numeric design inconsistent. You keep
>> saying that Clojure is changing the types - that's probably not the right
>> way to look at it.
>>
>> It's a semantic change, Clojure now only has 64bit primitives - the same way
>> that JavaScript only has doubles.
>>
>> Prior to the 1.3 change, the semantics gave you a free lunch around
>> primitive ints in the interop scenario. Now you have be explicit just as you
>> do with pretty much any kind of Java interop.
>>
>> David
>>
>>
>>
>>
>>
>>
>>
>> On Thu, Oct 20, 2011 at 3:16 PM, nathanmarz <nathan.m...@gmail.com> wrote:
>> > Oops, I meant "Clojure should box primitive ints as Integers." :-)
>>
>> > On Oct 20, 12:15 pm, nathanmarz <nathan.m...@gmail.com> wrote:
>> > > Thanks, that clarifies the behavior. Regardless though, at some point
>> > > the "int" is becoming a "Long" which is a change of type. I'm arguing
>> > > that Clojure should box primitive ints as Longs.
>>
>> > > Stu, I wouldn't say Clojure's behavior makes it "just work". For
>> > > example, if I obtained by number using Integer/valueOf, then Clojure
>> > > will not change the Integer to a Long and will not prevent me from
>> > > putting it in a collection.  It's confusing that Integer/valueOf will
>> > > stay an Integer in Clojure-land, and Integer/parseInt will become a
>> > > Long in Clojure-land.
>>
>> > > The use case I'm interested in here is just this one point of Java
>> > > interop: what Clojure does with primitive ints that it gets from a
>> > > Java object (as far as I can tell, this is the only way to get a
>> > > primitive int in Clojure 1.3). I think it's better that Clojure be
>> > > consistent in its treatment of Integer objects and primitive ints by
>> > > not changing the types on you.
>>
>> > > -Nathan
>>
>> > > On Oct 20, 10:19 am, Justin Kramer <jkkra...@gmail.com> wrote:
>>
>> > > > Oops, I elided a little too much. Need a method with an Object
>> > signature to
>> > > > distinguish Integer from int:
>>
>> > > > (definterface IPrimitiveTester
>> > > >   (getType [^int x])
>> > > >   (getType [^long x])
>> > > >   ;; etc
>> > > >   (getType [^Object x]))
>>
>> > > > (deftype PrimitiveTester []
>> > > >   IPrimitiveTester
>> > > >   (getType [this ^int x] :int)
>> > > >   (getType [this ^long x] :long)
>> > > >   ;; etc
>> > > >   (getType [this ^Object x] :object))
>>
>> > > > (defmacro primitive-type [x]
>> > > >   `(.getType (PrimitiveTester.) ~x))
>>
>> > > > (comment
>>
>> > > >   user=> (primitive-type (Integer. 5))
>> > > >   :object
>> > > >   user=> (primitive-type (Integer/parseInt "5"))
>> > > >   :int
>>
>> > > >   )
>>
>> > > > On Thursday, October 20, 2011 1:13:03 PM UTC-4, Justin Kramer wrote:
>>
>> > > > > Here's a quick proof using an interface-based primitive detector:
>>
>> > > > > (definterface IPrimitiveTester
>> > > > >   (getType [^int x])
>> > > > >   (getType [^long x])
>> > > > >   ;; other types elided
>> > > > >   )
>>
>> > > > > (deftype PrimitiveTester []
>> > > > >   IPrimitiveTester
>> > > > >   (getType [this ^int x] :int)
>> > > > >   (getType [this ^long x] :long)
>> > > > >   ;; other types elided
>> > > > >   )
>>
>> > > > > (defmacro primitive-type [x]
>> > > > >   `(.getType (PrimitiveTester.) ~x))
>>
>> > > > > (comment
>>
>> > > > >   user=> (primitive-type 5) ;unboxed
>> > > > >   :long
>> > > > >   user=> (primitive-type (Integer/parseInt "5")) ;unboxed
>> > > > >   :int
>> > > > >   user=> (class (Integer/parseInt "5")) ;boxed
>> > > > >   java.lang.Long
>>
>> > > > >   )
>>
>> > > > > Justin
>>
>> > --
>> > 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



-- 
And what is good, Phaedrus,
And what is not good—
Need we ask anyone to tell us these things?

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