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
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en