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

Reply via email to