Following up, point (2) in my previous message would be helpful only if =
were changed so that it looked at the stripTrailingZeros() value of
BigDecimals. I would advocate this in any case, because the following
behavior appears silly to me (is it useful to anyone?):

user=> (== 434343.00M 434343.0M) ;BigDecimal works this way, apparently
false
user=> (= 434343.00M 434343.0M) ;odd, however
false
user=> (= 434343.00M 434343.0)
false
user=> (== 434343.00M 434343.0) ;even odder, in my opinion, given the above
true
user=> (= (.stripTrailingZeros 434343.00M) (.stripTrailingZeros 434343.0M))
;shouldn't = default to this?
true

Garth

On Fri, Jun 25, 2010 at 4:18 PM, Garth Sheldon-Coulson <g...@mit.edu> wrote:

> This looks excellent.
>
> I'd like to re-raise a question I had a few days ago: Will this ultimately
> come to affect floats, too?
>
> In particular:
>
> 1) If there is going to be BigInt contagion, why not BigDecimal contagion?
>
> user=> (* 4 5)
> 20
> user=> (* 4 5N)
> 20N
>
> but
>
> user=> (* 4.0 5.0)
> 20.0
> user=> (* 4.0 5.0M) ;no contagion
> 20.0
> user=> (* 4.0M 5.0M)
> 20.00M
> user=> (* 4.0 5.0000000000000000001M) ;not even when it's needed
> 20.0
> user=> (* 4.0M 5.0000000000000000001M)
> 20.00000000000000000040M
>
> 2) Will the same reasoning that produced BigInt give us a BigDec with a
> better hashCode() than that of BigDecimal?
>
> user=> (hash 4343434343)
> 48467046
> user=> (hash (BigInteger. "4343434343")) ;not very nice
> 48467078
> user=> (hash 4343434343N) ;nice as of equiv branch
> 48467046
>
> but
>
> user=> (hash 4343.4343)
> 1861754824
> user=> (hash 4343.4343M) ;not very nice
> 1346464637
>
> user=> (defn -hashCode [this]
>   (let [dv (.doubleValue this)]
>     (if (== this dv)
>       (.hashCode dv)
>       (.hashCode this))))
> #'user/-hashCode
>
> user=> (hash 4343.4343)
> 1861754824
> user=> (-hashCode 4343.4343M) ;nicer
> 1861754824
>
> Garth
>
>
>
> On Fri, Jun 25, 2010 at 3:04 PM, Rich Hickey <richhic...@gmail.com> wrote:
>
>> equiv, the revenge of num
>>
>> The latest revision of primitive support is in the equiv branch. It takes
>> the approach of num, with no auto-promotion, and bigint contagion, and adds
>> several things to better support contagion. I think contagion is the best
>> way to continue to support polymorphic numeric code, something I consider
>> important.
>>
>> Contagion has several issues. First and foremost, it means that it it will
>> be possible for 42 and 42N to be produced in the course of normal
>> operations, so strict type-specific equality is not a good match. The equiv
>> branch brings back equivalence-based =, with a slightly tighter notion of =,
>> supporting only similar categories of numbers, so (= 42 42.0) => false, but
>> (= 42 42N) => true. == is still available.
>>
>> The second problem is the use of numbers (and collections of numbers) as
>> keys in hash maps and members of hash sets. We already had an issue here, as
>> there wasn't completely uniform boxing, and there will always be the
>> possibility of numbers from the outside. The equal branch tried to use
>> consistent boxing and type-specific =, but it was still open to mismatch
>> with numbers from outside. The equiv branch extends = to keys and set
>> members when used from Clojure, i.e. Clojure get and contains will use =
>> logic, while the Java get and containsKey will use .equals(). I.e. we will
>> still satisfy the semantics of Java when used through the Java APIs, but
>> nothing said the Clojure API must match those semantics. When combined with
>> the new BigInt class (see below), this will allow you to look up (and find!)
>> the integer 42 with either 42 or 42N.
>>
>> The equiv branch also has a new BigInt type. This is strictly necessary
>> for this scheme, as Java's BigIntegers and Longs can produce different
>> hashCodes for the same values. In addition to matching hashCode support, the
>> BigInt class opens the door to better performance when used with numbers
>> long-or-smaller. These performance enhancements have not yet been made.
>>
>> More details have been added to the top here:
>>
>>
>> https://www.assembla.com/wiki/show/b4-TTcvBSr3RAZeJe5aVNr/Enhanced_Primitive_Support
>>
>> Code is here:
>>
>> http://github.com/richhickey/clojure/commits/equiv
>>
>>
>> Feedback welcome,
>>
>> Rich
>>
>> --
>> 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<clojure%2bunsubscr...@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

Reply via email to