Ugh.  Too many typos there.  Here is what I meant:

If the reason that defrecord hashing is slow in your application is because
_hasheq_ recalculates the hash values from scratch each time, without
_caching the value_, consider voting for this ticket so that is improved in
the future: http://dev.clojure.org/jira/browse/CLJ-1224

On Thu, Jun 11, 2015 at 12:19 PM, Andy Fingerhut <andy.finger...@gmail.com>
wrote:

> You can override hashCode and/or hasheq methods in deftype.
>
> If the reason that defrecord hashing is slow in your application is
> because hashed recalculates the hash values from scratch each time, without
> hashing, consider voting for this ticket so that is improved in the future:
> http://dev.clojure.org/jira/browse/CLJ-1224
>
> Andy
>
> On Thu, Jun 11, 2015 at 11:36 AM, Mars0i <marsh...@logical.net> wrote:
>
>> I think that the following is all correct, but I could be wrong about
>> something.
>>
>> The datatypes page at clojure.org <http://clojure.org/datatypes> says:
>> "defrecord provides ... value-based equality and hashCode", while deftype
>> does not.   So
>> (defrecord Rec [x])
>> (= (Rec. 42) (Rec. 42)) ;=> true
>> but
>> (deftype Typ [x])
>> (= (Typ. 42) (Typ. 42)) ;=> false.
>> This also means, as I understand it, that data structures that use
>> hashing--maps and sets, for example--hash on value for records, but on
>> identity for types.  I believe that the same is true when Java hashtables
>> compare records, or compare types, although I haven't carefully tested this.
>>
>> It makes sense that the primary, most fully functional user-definable
>> datatypes in Clojure should use value-based equality; that's fully in the
>> spirit of a functional language, and is very convenient in many contexts,
>> and hashing should follow the equality semantics of the datatypes.  You can
>> always use identical? if you want to test records for identity rather
>> than equality.
>>
>> However, you can't tell maps and sets to use identity for records,
>> afaik.  This makes records undesirable if you only care about identity, and
>> need to use a data structure that uses hashing, and care about performance,
>> because value-based hashing is presumably a lot slower than identity-based
>> hashing (which is what my experiments seem to show).
>>
>> On the other hand, records are obviously way, way, more convenient than
>> types in many contexts because the functionality provided by deftype is so
>> bare-bones.  It really bothers me that I have to choose between speed and
>> using convenient, idiomatic functionality (defrecord) that is one of
>> several significant reasons that I love Clojure.  (This is in an
>> application in which value-based equality would *never* be what I wanted
>> for my datatypes.)
>>
>> Should there be an alternative?  Either a way to define e.g. a special
>> kind of set that uses identity rather than value for records, or a way to
>> make records use identity for equality, or another datatype that's just
>> like defrecord but ..., or a way to get more functionality with deftype, or
>> ...?  (I don't think that Clojure should include every option or
>> functionality that someone thinks might be convenient in some context.
>> Another reason that I love Clojure is that it *doesn't* do that, but
>> instead provides limited, well-thought out options that allow a lot of
>> flexibility.)
>>
>> In an earlier thread
>> <https://groups.google.com/forum/#!topic/clojure/EdjnSxRkOPk>, Stephen
>> Yi pointed out that although you're allowed to override some Object methods
>> in defrecord, you can't override Object.equals and Object.hashCode.  It
>> isn't documented, but the compiler throws an exception if you try it.  That
>> makes quite a bit of sense, since changing the meaning of equality for a
>> datatype would be an easy way to introduce confusing bugs.  On the other
>> hand, if you do override Object.equals and Object.hashCode for defrecord,
>> you probably know that you're doing something weird, and that you'd better
>> take precautions, if necessary, to avoid later confusion.
>>
>> --
>> 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 unsubscribe from this group and stop receiving emails from it, send an
>> email to clojure+unsubscr...@googlegroups.com.
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>

-- 
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 unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to