I'm also interested in that. I think it has to do with how clojure.lang.Compiler [1] works (since that is what eval uses), but since it is quite big, I don't know exactly what parts are important.
Jonathan [1] https://github.com/richhickey/clojure/blob/master/src/jvm/clojure/lang/Compiler.java On Thu, May 5, 2011 at 5:41 PM, Dominikus <dominikus.herzb...@gmail.com>wrote: > Thanks for the pointers to the implementation, Jonathan! > > Unfortunately, I couldnt' find out yet, which part of the source code > in Clojure 1.3 is responsible for fixing the misbehavior in 1.2. The > parts you point to haven't changed in 1.3. > > Cheers, > > Dominikus > > On May 5, 4:27 pm, Jonathan Fischer Friberg <odysso...@gmail.com> > wrote: > > = uses the clojure.lang.Util/equiv to compare two "things". The source of > > this function is: [1] > > > > static public boolean equiv(Object k1, Object k2){ > > if(k1 == k2) > > return true; > > if(k1 != null) > > { > > if(k1 instanceof Number && k2 instanceof Number) > > return Numbers.equiv(k1, k2); > > else if(k1 instanceof IPersistentCollection && k2 > instanceof > > IPersistentCollection) > > return ((IPersistentCollection)k1).equiv(k2); > > return k1.equals(k2); > > } > > return false; > > > > } > > > > Which says: > > if k1 and k2 is the same instance (has the same id), return true > > if k1 and k2 are numbers, compare them as numbers > > if k1 and k2 are collections, compare them as collections > > otherwise, use the function "equals" of the k1 object. > > > > The equals function defines "intelligent" (proper) comparison of two > > objects, and is defined by the programmer. If the equals function isn't > > defined, it behaves like == [2] > > The == function returns true if the "things" are of the same instance. > > > > I think functions in clojure are defined in [3], but I'm not entirely > sure. > > As you can see, equals isn't implemented, and thus = will only compare > > instance (id), as you have noticed. > > > > Jonathan > > > > [1] > https://github.com/richhickey/clojure/blob/master/src/jvm/clojure/lan... > > <https://github.com/richhickey/clojure/blob/master/src/jvm/clojure/lan.. > .> > > [2]http://leepoint.net/notes-java/data/expressions/22compareobjects.html > > [3] > https://github.com/richhickey/clojure/blob/master/src/jvm/clojure/lan... > > > > On Thu, May 5, 2011 at 3:04 PM, Dominikus <dominikus.herzb...@gmail.com> > > wrote: > > > > > > > > > > > > > > > > > > > > > My observation is best distilled with the following definition of a > > > function in Clojure 1.2: > > > > > user=> (defn id [x] (list id x)) > > > #'user/id > > > > > Interstingly, (id 7) and (eval (id 7)) result in different instances > > > of function id as the number after the '@' char unveils: > > > > > user=> (id 7) > > > (#<user$id user$id@53797795> 7) > > > user=> (eval (id 7)) > > > (#<user$id user$id@2de12f6d> 7) > > > > > Consequently, the following comparison leads to false: > > > > > user=> (= (id 7) (eval (id 7))) > > > false > > > > > Why is the instance relevant to '='? What is the precise semantics of > > > two values being equal in Clojure? > > > > > Dominikus > > > > > (Remark: In Scheme, the use of 'eqv?' returns also #f, but the less > > > restrictive 'equal?' does not and returns #t.) > > > > > -- > > > 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 > -- 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