[racket] clarification for beginners please

From: Robby Findler (robby at eecs.northwestern.edu)
Date: Thu Apr 25 22:09:36 EDT 2013

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 <olopierpa at 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 <
> robby at 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 <morazanm at 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 <jford at 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
>>>> jford at 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
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20130425/be23d92a/attachment-0001.html>

Posted on the users mailing list.