Hi Richard Indeed you are correct. We should continue to use and specialize postCopy. deepCopy and its friends such as veryDeepInnerInner …. do not smell good. Ideally I would like to remove all deepCopy and have a deepCopier that has a clear protocol and ask the objects. So may be at the end we will rewrite deepCopy but with tests and a clear semantics.
S/ > On 2 Jan 2021, at 02:32, Richard O'Keefe <rao...@gmail.com> wrote: > > Well, when you talk about "THE copying machinery" you have to be a bit more > specific. There is no such thing as #deepCopy or #shallowCopy in the ANSI > Smalltalk standard. Many Smalltalks have > Object>>copy > ^self shallowCopy postCopy > and encourage you to override #postCopy. > But nothing stops you doing > MyClass > methods for: 'copying' > copy > ^self > deepcopy > ^self > postCopy > ^self > shallowCopy > ^self > You will note that in Pharo, AtomicCollection, Behavior, Boolean, > Character, Float, SmallFloat64, Form, ColorForm, Morph, Paragraph, > Point, SmallInteger, String, UndefinedObject, and perhaps others > override #deepCopy. Also, Boolean, Character, Float, SmallFloat64, > SmallInteger, Symbol, UndefinedObject, and perhaps others > override #shallowCopy. > > So it *is* possible to have singletons in Smalltalk. > Classes can be copied in Pharo because someone thought it > would be a good idea. > > On to the next point. > 'I have an object whose internal state is updated > by incoming messages. I need to take immutable snapshots of that > object's state at some points. And that I do by sending "deepCopy" > and then "beRecursivelyReadOnlyObject".' > > You do not know which objects will be copied by #deepCopy and > which won't, or if you do, you cannot be sure that that will not > change in a future release, or indeed if you load a package. > You do not know whether some of these objects will break if made > read-only. > > #deepCopy is *serious* "Hic sunt dracones" territory. > It's marked on the Hunt-Lenox Globe, just beside the > Vesuvian introitus ad infernum. > > Seriously, the OOP way to do this is > MyClass>>immutableSnapshot > "Answer an immutable copy of myself." > ... > and then whatever it takes to make precisely that happen. > > > On Fri, 1 Jan 2021 at 23:35, Konrad Hinsen <konrad.hin...@fastmail.net > <mailto:konrad.hin...@fastmail.net>> wrote: > "Richard O'Keefe" <rao...@gmail.com <mailto:rao...@gmail.com>> writes: > > > #deepCopy is one of those things that is best avoided, > > because it violates the key principle of OOP that an > > In the abstract, I agree. In practice, I don't see what else I could do > for my use case. I have an object whose internal state is updated > by incoming messages. I need to take immutable snapshots of that > object's state at some points. And that I do by sending "deepCopy" > and then "beRecursivelyReadOnlyObject". > > Benoit St-Jean via Pharo-users <pharo-users@lists.pharo.org > <mailto:pharo-users@lists.pharo.org>> writes: > > > It never occurred to me that it would ever be the case! > > I've always thought classes were singleton and that SomeClass copy would > > always return the sole instance of that class! > > Me too. But after taking a closer look at how copy and deepCopy work, it > seems that maintaining singletons under copy operations is impossible. > There is no way to tell the copying machinery to return the original > object instead of making a new one. Unlike e.g. Python, where this is > possible and even quite common. > > Konrad.