Why ? Please explain ...
On 1 Mar 2019, at 18:02, David T. Lewis <lewis@mail.msen.com> wrote:
On Fri, Mar 01, 2019 at 05:18:27PM +0100, Sven Van Caekenberghe wrote:
On 1 Mar 2019, at 17:08, Petr Fischer via Pharo-users <pharo-users@lists.pharo.org> wrote:
From: Petr Fischer <petr.fischer@me.com> Subject: Symbol equality method #= - weird condition in the Pharo sourcecode Date: 1 March 2019 at 17:08:03 GMT+1 To: pharo-users@lists.pharo.org
Hello, this is Symbol equality method in Pharo:
1: = aSymbol 2: "Compare the receiver and aSymbol." 3: self == aSymbol ifTrue: [^ true]. 4: self class == aSymbol class ifTrue: [^ false]. 5: "Use String comparison otherwise" 6: ^ super = aSymbol
Look at line 4 - what does it mean? That's wrong, isn't it?
Typically, every symbol comparisons end up in line 3, but if you do some work with forward proxies for example, condition on line 3 is "false" and then weird things on line 4 happens.
If line 4 and further are correct, can someone explain a little?
Thanks! pf
Yes, that looks weird. Line 4 should probably be removed, unless I am missing something.
It is wrong in a Spur image, because we now have subclasses of Symbol. But removing line 4 is not the right solution. See Nicolas' implementation in Squeak:
Symbol>>= aSymbol "Compare the receiver and aSymbol." self == aSymbol ifTrue: [^ true]. aSymbol isSymbol ifTrue: [^ false]. "Use String comparison otherwise" ^ super = aSymbol
Dave
Symbols are by definition always #== so in that sense, #= should not even be implemented (as #= on Object is defined as #==), but since its direct super class String already overwrote #=, it has to follow.
The super call in line 6 is what allows Symbols and String to be compared.
I would say line 4 is a kind of sanity check, but probably not needed.