Yes, except that we do know something about what happens when it returns #t in the "in all other cases" case.
Robby On Thu, Apr 25, 2013 at 9:03 PM, Pierpaolo Bernardi <olopie...@gmail.com>wrote: > The traditional way of explaining eq? is that it works when one of the > arguments is a symbol or a mutable data structure. In all other cases the > result is implementation dependent. Is this explanation still valid for > racket? > > > > On Fri, Apr 26, 2013 at 1:37 AM, Robby Findler < > ro...@eecs.northwestern.edu> wrote: > >> I don't think that either of these explanations are really the right way >> to think about eq?. The only way to really understand eq? on immutable >> values is to understand that it is exposing low-level details of the >> implementation to you (ostensibly for performance reasons). That is, if >> (eq? a b) returns #true (where a and b are immutable things like the >> structs in the previous messages), then that tells you that equal? will >> return also return #true. When it returns #false all you know is that >> equal? may or may not return #true (ie, you know nothing). >> >> This may seem like a strange primitive (and it is), but it can be very >> useful for performance reasons, since it takes constant time but equal? may >> take up to linear time in the size of its inputs. >> >> When the arguments are mutable objects, then Macros and Danny's >> explanations are a good way to start understanding them. >> >> (After all, if you punch one crab named "Joe", the other one doesn't get >> a bruise.) >> >> Robby >> >> >> On Thu, Apr 25, 2013 at 3:45 PM, Marco Morazan <moraz...@gmail.com>wrote: >> >>> Joe, >>> >>> Perhaps a more pedestrian explanation might help. There is a difference >>> between two items having the same value and two items being the same item. >>> >>> equal? tests if its two items have the same value. >>> >>> eq? tests if two items are the same item. >>> >>> Using your example: >>> >>> >>> (define A (make-posn 4 5)) >>> (define B (make-posn (+ 3 1) (- 6 1))) >>> >>> Both A and B are items (in this case posns) that have the same value. >>> Thus, (equals? A B) is true. >>> >>> A and B, however, are not the same item (they are two different posns >>> that happen to have the same value). Thus, (eq? A B) is false. >>> >>> Consider: >>> >>> (define C B) >>> >>> Now, C and B are the same item (the same posn). Thus, (eq? C B) is true. >>> As C and A are not the same posn, we have (eq? C A) is false. As you would >>> expect (equal? C A) is true (because the have the same value). >>> >>> eq? returning true suffices to know that equal? returns true (if two >>> items are the same item, then clearly they have the same value). equal? >>> returning true does not suffice to know what eq? returns (given that two >>> different items may or may not have the same value). >>> >>> This difference is not relevant for most of HtDP, because it is not >>> until your reach the material with assignment that you need to >>> understand/know if two items are the same item or not. Before the >>> assignment material, you are always testing for value equality. >>> >>> Finally, eqv? is not used in HtDP and my advice would be to ignore its >>> existence with beginners. >>> >>> I hope this helps. >>> >>> Marco >>> >>> >>> >>> >>> On Thu, Apr 25, 2013 at 2:31 PM, Ford, Joe <jf...@hollandhall.org>wrote: >>> >>>> I have a group of high school students with a question... can someone >>>> please explain to beginner Racket users the differences between these three >>>> boolean functions: eq? equal? eqv? >>>> >>>> We have read the help menu verbage visible from DrRacket, but simply >>>> don't understand what it is saying. Maybe that's lack of context or >>>> vocabulary... but we're struggling a bit. To test simple variations of >>>> application, we wrote some simple code (shown below) but don't understand >>>> why the results are what they are: >>>> >>>> (define FOUR "four") >>>> (define A (make-posn 4 5)) >>>> (define B (make-posn (+ 3 1) (- 6 1))) >>>> "-------------" >>>> (equal? FOUR "four") >>>> (equal? 4 (+ 1 3)) >>>> (equal? 4 (posn-x (make-posn 4 3))) >>>> (equal? A B) >>>> "-------------" >>>> (eq? FOUR "four") >>>> (eq? 4 (+ 1 3)) >>>> (eq? 4 (posn-x (make-posn 4 3))) >>>> (eq? A B) >>>> "---------------" >>>> (eqv? FOUR "four") >>>> (eqv? 4 (+ 1 3)) >>>> (eqv? 4 (posn-x (make-posn 4 3))) >>>> (eqv? A B) >>>> >>>> >>>> Why in the world would the above-defined A and B be considered "equal?" >>>> but not "eq?" or "eqv?"? >>>> >>>> -- >>>> *Joe Ford >>>> Technology Resources, Scheduling & Yearbook >>>> Holland Hall >>>> jf...@hollandhall.org >>>> >>>> * >>>> >>>> >>>> ____________________ >>>> Racket Users list: >>>> http://lists.racket-lang.org/users >>>> >>>> >>> >>> >>> -- >>> >>> Cheers, >>> >>> Marco >>> >>> Have a´¨) >>> ¸.·´¸.·*´¨) ¸.·*¨) >>> (¸.·´ (¸.·´ * wonderful day! :) >>> >>> ____________________ >>> Racket Users list: >>> http://lists.racket-lang.org/users >>> >>> >> >> ____________________ >> Racket Users list: >> http://lists.racket-lang.org/users >> >> >
____________________ Racket Users list: http://lists.racket-lang.org/users