Is it consistent with the definition of #= in String such that 'aSymbol = aString' iff 'aString = aSymbol'? Sorry, I don't have an image at hand.
Am 1. März 2019 18:40:11 MEZ schrieb Sven Van Caekenberghe <s...@stfx.eu>: >Why ? Please explain ... > >> On 1 Mar 2019, at 18:02, David T. Lewis <le...@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.fisc...@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.