<html><body><div>I might add that both methods have warnings against use.</div><div><br data-mce-bogus="1"></div><div>The method comment for copyFrom: says:</div><div>This is dangerous because it ignores an object's control over its own inst vars. </div><div><br data-mce-bogus="1"></div><div>The method comment from copySameFrom: says:</div><div>This ignores otherObject's control over its own inst vars.</div><div><br data-mce-bogus="1"></div><div>I don't know what kind of warning you need if you ignore the method comments. Maybe referring to a book of object-oriented programming is in order. Smalltalk isn't like Python, where all the definitions of a programing style are out the window. Maybe that's why Python is so popular.</div><div><br data-mce-bogus="1"></div><div>On January 4, 2020 at 9:27 AM, Jakob Reschke <forums.jakob@resfarm.de> wrote:<br><br></div><div><blockquote type="cite"><div class="msg-quote"><div dir="ltr">I assume it does work for the intended use case. Probably converting between classes of the same hierarchy. That's where I used copySameFrom: once, to "dumb down" an object to one with less features (in this case: mutation methods).</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Am Sa., 4. Jan. 2020 um 17:21 Uhr schrieb Thiede, Christoph <<a href="mailto:Christoph.Thiede@student.hpi.uni-potsdam.de" data-mce-href="mailto:Christoph.Thiede@student.hpi.uni-potsdam.de">Christoph.Thiede@student.hpi.uni-potsdam.de</a>>:<br></div><blockquote class="gmail_quote" style="margin: 0px 0px 0px 0.8ex; border-left: 1px solid #cccccc; padding-left: 1ex;" data-mce-style="margin: 0px 0px 0px 0.8ex; border-left: 1px solid #cccccc; padding-left: 1ex;"><div><div id="gmail-m_1648367796741277813divtagdefaultwrapper" style="font-size: 12pt; color: #000000; font-family: Calibri,Helvetica,sans-serif;" dir="ltr" data-mce-style="font-size: 12pt; color: #000000; font-family: Calibri,Helvetica,sans-serif;"><p>@Jakob: I know that. But if we have an implementation, it should be right, shouldn't it? And this is commonly used in Object >> #as: or Object class >> #newFrom:.</p><p><br></p><p>Best,</p><p>Christoph</p><div id="gmail-m_1648367796741277813Signature"><div id="gmail-m_1648367796741277813divtagdefaultwrapper" dir="ltr" style="font-size: 12pt; color: #000000; font-family: Calibri,Helvetica,sans-serif,EmojiFont,'Apple Color Emoji','Segoe UI Emoji',NotoColorEmoji,'Segoe UI Symbol','Android Emoji',EmojiSymbols;" data-mce-style="font-size: 12pt; color: #000000; font-family: Calibri,Helvetica,sans-serif,EmojiFont,'Apple Color Emoji','Segoe UI Emoji',NotoColorEmoji,'Segoe UI Symbol','Android Emoji',EmojiSymbols;"><div><div><div id="gmail-m_1648367796741277813Item.MessagePartBody"><div id="gmail-m_1648367796741277813Item.MessageUniqueBody" style="font-family: wf_segoe-ui_normal,'Segoe UI','Segoe WP',Tahoma,Arial,sans-serif,serif,EmojiFont;" data-mce-style="font-family: wf_segoe-ui_normal,'Segoe UI','Segoe WP',Tahoma,Arial,sans-serif,serif,EmojiFont;"><div dir="ltr"><div id="gmail-m_1648367796741277813divtagdefaultwrapper"><span face="Calibri,Helvetica,sans-serif,EmojiFont,Apple Color Emoji,Segoe UI Emoji,NotoColorEmoji,Segoe UI Symbol,Android Emoji,EmojiSymbols" data-mce-style="font-family: Calibri, Helvetica, sans-serif, EmojiFont, 'Apple Color Emoji', 'Segoe UI Emoji', NotoColorEmoji, 'Segoe UI Symbol', 'Android Emoji', EmojiSymbols;" style="font-family: Calibri, Helvetica, sans-serif, EmojiFont, 'Apple Color Emoji', 'Segoe UI Emoji', NotoColorEmoji, 'Segoe UI Symbol', 'Android Emoji', EmojiSymbols;"><div id="gmail-m_1648367796741277813Signature"><div style="margin: 0px;" data-mce-style="margin: 0px;"><span data-mce-style="font-family: Calibri,Arial,Helvetica,sans-serif,serif,EmojiFont;" style="font-family: Calibri,Arial,Helvetica,sans-serif,serif,EmojiFont;"><div><span size="3" color="black" data-mce-style="color: black; font-size: medium;" style="color: black; font-size: medium;"><span style="font-size: 12pt;" data-mce-style="font-size: 12pt;"><a href="http://www.hpi.de/" id="gmail-m_1648367796741277813LPNoLP" data-mce-href="http://www.hpi.de/"><span size="2" data-mce-style="font-size: small;" style="font-size: small;"><span id="gmail-m_1648367796741277813LPlnk909538"><span color="#757B80" data-mce-style="color: #757b80;" style="color: #757b80;"></span></span></span></a></span></span><br></div></span></div></div></span></div></div></div></div></div><div><span size="2" color="#808080" data-mce-style="color: #808080; font-size: small;" style="color: #808080; font-size: small;"></span><br></div></div></div></div></div><hr style="display: inline-block; width: 98%;" data-mce-style="display: inline-block; width: 98%;"><div id="gmail-m_1648367796741277813divRplyFwdMsg" dir="ltr"><span face="Calibri, sans-serif" data-mce-style="font-size: 11pt; color: #000000; font-family: Calibri, sans-serif;" style="font-size: 11pt; color: #000000; font-family: Calibri, sans-serif;" color="#000000"><b>Von:</b> Squeak-dev <<a href="mailto:squeak-dev-bounces@lists.squeakfoundation.org" data-mce-href="mailto:squeak-dev-bounces@lists.squeakfoundation.org">squeak-dev-bounces@lists.squeakfoundation.org</a>> im Auftrag von Jakob Reschke <<a href="mailto:forums.jakob@resfarm.de" data-mce-href="mailto:forums.jakob@resfarm.de">forums.jakob@resfarm.de</a>><br> <b>Gesendet:</b> Samstag, 4. Januar 2020 17:18:58<br> <b>An:</b> The general-purpose Squeak developers list<br> <b>Betreff:</b> Re: [squeak-dev] Object >> #copyFrom: vs Object >> #copySameFrom:</span><div> </div></div><div><div dir="ltr">Keep in mind that copying the variables by name to an *unrelated* class breaks encapsulation and relying on the copying couples the classes tightly.<div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Am Sa., 4. Jan. 2020 um 16:03 Uhr schrieb Thiede, Christoph <<a href="mailto:Christoph.Thiede@student.hpi.uni-potsdam.de" data-mce-href="mailto:Christoph.Thiede@student.hpi.uni-potsdam.de">Christoph.Thiede@student.hpi.uni-potsdam.de</a>>:<br></div><blockquote class="gmail_quote" style="margin: 0px 0px 0px 0.8ex; border-left: 1px solid #cccccc; padding-left: 1ex;" data-mce-style="margin: 0px 0px 0px 0.8ex; border-left: 1px solid #cccccc; padding-left: 1ex;"><div dir="ltr"><div id="gmail-m_1648367796741277813gmail-m_2272617115244714960divtagdefaultwrapper" style="font-size: 12pt; color: #000000; font-family: Calibri,Helvetica,sans-serif;" dir="ltr" data-mce-style="font-size: 12pt; color: #000000; font-family: Calibri,Helvetica,sans-serif;"><div id="gmail-m_1648367796741277813gmail-m_2272617115244714960divtagdefaultwrapper" style="font-size: 12pt; color: #000000; font-family: Calibri,Helvetica,sans-serif,EmojiFont,'Apple Color Emoji','Segoe UI Emoji',NotoColorEmoji,'Segoe UI Symbol','Android Emoji',EmojiSymbols;" dir="ltr" data-mce-style="font-size: 12pt; color: #000000; font-family: Calibri,Helvetica,sans-serif,EmojiFont,'Apple Color Emoji','Segoe UI Emoji',NotoColorEmoji,'Segoe UI Symbol','Android Emoji',EmojiSymbols;"><p>Hi Levente,</p><p><br></p><p>yes, that would look more intuitive for me. Why else should any of these methods ask for #allInstVarNames?</p><p><br></p><p>I would like to propose something like this:</p><p><br></p></div><blockquote style="margin: 0px 0px 0px 40px; border: none; padding: 0px;" data-mce-style="margin: 0px 0px 0px 40px; border: none; padding: 0px;"><div style="font-size: 12pt; color: #000000; font-family: Calibri,Helvetica,sans-serif,EmojiFont,'Apple Color Emoji','Segoe UI Emoji',NotoColorEmoji,'Segoe UI Symbol','Android Emoji',EmojiSymbols;" dir="ltr" data-mce-style="font-size: 12pt; color: #000000; font-family: Calibri,Helvetica,sans-serif,EmojiFont,'Apple Color Emoji','Segoe UI Emoji',NotoColorEmoji,'Segoe UI Symbol','Android Emoji',EmojiSymbols;"><p><br></p><div>copyFrom: anotherObject</div><div><span style="white-space: pre-wrap;" data-mce-style="white-space: pre-wrap;"></span>"Copy to myself all instance variables I have in common with anotherObject.  This is dangerous because it ignores an object's control over its own inst vars.  "</div><div><br></div><div><span style="white-space: pre-wrap;" data-mce-style="white-space: pre-wrap;"></span>| otherInstVars |</div><div><span style="white-space: pre-wrap;" data-mce-style="white-space: pre-wrap;"></span><primitive: 168></div><div><span style="white-space: pre-wrap;" data-mce-style="white-space: pre-wrap;"></span>otherInstVars := (anotherObject class allInstVarNames</div><div><span style="white-space: pre-wrap;" data-mce-style="white-space: pre-wrap;"></span>withIndexCollect: [:name :index | name -> (anotherObject instVarAt: index)])</div><div><span style="white-space: pre-wrap;" data-mce-style="white-space: pre-wrap;"></span>as: Dictionary.</div><div><span style="white-space: pre-wrap;" data-mce-style="white-space: pre-wrap;"></span>self class allInstVarNames withIndexDo: [:name :index |</div><div><span style="white-space: pre-wrap;" data-mce-style="white-space: pre-wrap;"></span>otherInstVars at: name ifPresent: [:value |</div><div><span style="white-space: pre-wrap;" data-mce-style="white-space: pre-wrap;"></span>self instVarAt: index put: value]].</div><div><span style="white-space: pre-wrap;" data-mce-style="white-space: pre-wrap;"></span>(self class isVariable and: [anotherObject class isVariable]) ifTrue: [</div><div><span style="white-space: pre-wrap;" data-mce-style="white-space: pre-wrap;"></span>1 to: (self basicSize min: anotherObject basicSize) do: [:ind |</div><div><span style="white-space: pre-wrap;" data-mce-style="white-space: pre-wrap;"></span>self basicAt: ind put: (anotherObject basicAt: ind)]].</div><p><br></p></div></blockquote><div style="font-size: 12pt; color: #000000; font-family: Calibri,Helvetica,sans-serif,EmojiFont,'Apple Color Emoji','Segoe UI Emoji',NotoColorEmoji,'Segoe UI Symbol','Android Emoji',EmojiSymbols;" dir="ltr" data-mce-style="font-size: 12pt; color: #000000; font-family: Calibri,Helvetica,sans-serif,EmojiFont,'Apple Color Emoji','Segoe UI Emoji',NotoColorEmoji,'Segoe UI Symbol','Android Emoji',EmojiSymbols;"><p><br></p><p>Best,</p><p>Christoph</p><br><div style="color: #000000;" data-mce-style="color: #000000;"><div><hr style="display: inline-block; width: 98%;" data-mce-style="display: inline-block; width: 98%;"><div id="gmail-m_1648367796741277813gmail-m_2272617115244714960x_divRplyFwdMsg" dir="ltr"><span face="Calibri, sans-serif" color="#000000" data-mce-style="font-size: 11pt; color: #000000; font-family: Calibri, sans-serif;" style="font-size: 11pt; color: #000000; font-family: Calibri, sans-serif;"><b>Von:</b> Squeak-dev <<a href="mailto:squeak-dev-bounces@lists.squeakfoundation.org" data-mce-href="mailto:squeak-dev-bounces@lists.squeakfoundation.org">squeak-dev-bounces@lists.squeakfoundation.org</a>> im Auftrag von Levente Uzonyi <<a href="mailto:leves@caesar.elte.hu" data-mce-href="mailto:leves@caesar.elte.hu">leves@caesar.elte.hu</a>><br> <b>Gesendet:</b> Samstag, 4. Januar 2020 04:34 Uhr<br> <b>An:</b> The general-purpose Squeak developers list<br> <b>Betreff:</b> Re: [squeak-dev] Object >> #copyFrom: vs Object >> #copySameFrom:</span><div> </div></div></div><span size="2" data-mce-style="font-size: small;" style="font-size: small;"><span style="font-size: 10pt;" data-mce-style="font-size: 10pt;"><div>Hi Christoph,<br> <br> On Sat, 4 Jan 2020, Thiede, Christoph wrote:<br> <br> > <br> > Hi Levente, thanks for the feedback.<br> > <br> > <br> > > What's your use-case?<br> > Actually not a real use case, I was just confused by the confusion of both methods.<br> > <br> > But I would find it cool if my first code example would work, for the best support of converting arbitrary objects between each other.<br> <br> It's not clear to me what the expected result of your first example is. Is <br> it that instance variables are copied by name?<br> <br> <br> Levente<br> <br> > <br> > Best,<br> > Christoph<br> > <br> > _________________________________________________________________________________________________________________________________________________________________________________________________________________________________<br> > Von: Squeak-dev <<a href="mailto:squeak-dev-bounces@lists.squeakfoundation.org" data-mce-href="mailto:squeak-dev-bounces@lists.squeakfoundation.org">squeak-dev-bounces@lists.squeakfoundation.org</a>> im Auftrag von Levente Uzonyi <<a href="mailto:leves@caesar.elte.hu" data-mce-href="mailto:leves@caesar.elte.hu">leves@caesar.elte.hu</a>><br> > Gesendet: Freitag, 3. Januar 2020 23:14:07<br> > An: The general-purpose Squeak developers list<br> > Betreff: Re: [squeak-dev] Object >> #copyFrom: vs Object >> #copySameFrom:  <br> > Hi Christoph,<br> > <br> > On Fri, 3 Jan 2020, Thiede, Christoph wrote:<br> > <br> > ><br> > > Hi Levente,<br> > ><br> > ><br> > > I don't get that.<br> > ><br> > ><br> > > Did I interpret your explanation correctly?<br> > <br> > Yes, you did. I just checked why it doesn't work, and it turned out I<br> > misremembered how it actually works.<br> > The primitive's comment is:<br> > <br> >          Copy the state of the receiver from the argument.<br> >                  Fail if receiver and argument are of a different class.<br> >                  Fail if the receiver or argument are contexts (because of context-to-stack mapping).<br> >                  Fail if receiver and argument have different lengths (for indexable objects).<br> >                  Fail if the objects are not in a fit state to be copied (e.g. married contexts and Cogged methods<br> > <br> > So, it'll fail, because the classes are not the same (an artifical<br> > limitation IMO).<br> > The fallback code will only copy slots of the same index if they have the<br> > same name (also an artificial limitation).<br> > <br> > What's your use-case?<br> > <br> > <br> > Levente<br> > <br> > ><br> > ><br> > >       fooClass := Object newUniqueClassInstVars: 'a b' classInstVars: ''.<br> > > barClass := Object newUniqueClassInstVars: 'b c' classInstVars: ''.<br> > > foo := fooClass new.<br> > > bar := barClass new<br> > > instVarNamed: #b put: 2;<br> > > instVarNamed: #c put: 3;<br> > > yourself.<br> > > foo copyFrom: bar.<br> > > foo instVarNamed: #b "expected: 2, actual: nil"<br> > ><br> > ><br> > > Otherwise, if I put #b as the first instvar in both classes, #copyFrom: and #copySameFrom: won't differ again ...<br> > ><br> > ><br> > > Best,<br> > ><br> > > Christoph<br> > ><br> > ><br> > >________________________________________________________________________________________________________________________________________________________________________________________________________________________________<br> > _<br> > > Von: Squeak-dev <<a href="mailto:squeak-dev-bounces@lists.squeakfoundation.org" data-mce-href="mailto:squeak-dev-bounces@lists.squeakfoundation.org">squeak-dev-bounces@lists.squeakfoundation.org</a>> im Auftrag von Levente Uzonyi <<a href="mailto:leves@caesar.elte.hu" data-mce-href="mailto:leves@caesar.elte.hu">leves@caesar.elte.hu</a>><br> > > Gesendet: Freitag, 3. Januar 2020 19:05 Uhr<br> > > An: The general-purpose Squeak developers list<br> > > Betreff: Re: [squeak-dev] Object >> #copyFrom: vs Object >> #copySameFrom:  <br> > > Hi Christoph,<br> > ><br> > > The two methods are different. #copyFrom: copies variables by index while<br> > > #copySameFrom: copies variables by name.<br> > > So, if you have an object named foo of class Foo with 2 instance variables<br> > > a and b, and an object named bar of class Bar with 2 instance variables b<br> > > and c, then foo copyFrom: bar will copy bar's b to foo's a, and bar's c to<br> > > foo's b. #copySameFrom: will copy bar's b to foo's b and leave foo's a as<br> > > is.<br> > ><br> > > Levente<br> > ><br> > ><br> > > On Fri, 3 Jan 2020, Thiede, Christoph wrote:<br> > ><br> > > ><br> > > > Hi all,<br> > > ><br> > > ><br> > > > I don't get the actual difference between #copyFrom: and #copySameFrom:.<br> > > ><br> > > ><br> > > > The latter looks more "modern" to me, as it uses a primitive and has several implementors.<br> > > ><br> > > > In my opinion, none of them actually matches its description ("Copy to myself all instance variables [named the same in | I have in common with] otherObject"). The following leaves o2 empty:<br> > > ><br> > > ><br> > > > c1 := Object newUniqueClassInstVars: 'foo bar' classInstVars: ''.<br> > > > c2 := Object newUniqueClassInstVars: 'bar foo' classInstVars: ''.<br> > > > o1 := c1 new<br> > > > instVarNamed: #foo put: 6;<br> > > > instVarNamed: #bar put: 7.<br> > > > o2 := o1 as: c2.<br> > > > o2 instVarAt: 1 "nil".<br> > > ><br> > > > o2 copySameFrom: o1.<br> > > > o2 instVarAt: 1 "nil".<br> > > ><br> > > ><br> > > > Question: Could we deprecate #copySameFrom:, and in #copyFrom:, copy *all* matching instvars without respecting their order? Or did I miss any intended difference in behavior?<br> > > ><br> > > > Best,<br> > > > Christoph<br> > > ><br> > > ><br> > > ><br> > ><br> > ><br> > <br> ></div></span></span></div></div></div></div><br></blockquote></div></div></div><br></blockquote></div><div class="_stretch"><span class="body-text-content"><br></span></div></div></blockquote></div></body></html>