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