[squeak-dev] Changing an object's class

Levente Uzonyi leves at elte.hu
Sun May 1 00:19:24 UTC 2011


On Sat, 30 Apr 2011, Frank Shearar wrote:

> Hi,
>
> I've been playing around with immutable data structures (at least, as 
> immutable as one gets).
>
> I came across an interesting algorithm for rebalancing a binary tree, 
> invented by Day, Stout and Warren. It's an in-place pointer-swizzler that, 
> with constant additional space, rebalances a tree in linear time. Of course, 
> it operates on a mutable structure.
>
> So I had an idea: I could "ringfence" the mutation: from my immutable 
> structure, create a mutable copy, tear it to bits and then recreate a new, 
> immutable, balanced, tree.
>
> So I wrote, in addition to my ZTree node class, a MutableZTree subclass. It 
> has the same shape as its parent (no new instvars), and a bunch of extra 
> mutating methods.
>
> There are some costs involved in this, of course: I create two entire copies 
> of the tree. One, making the mutable copy, seems unavoidable: you cannot 
> simply un-immutable the tree, because you have no idea what other objects 
> might have a reference to parts of the tree, and they all assume the tree's 
> immutable. The other, however... well, we don't care about references to the 
> mutable structure because there should be no references to it. It's purely an 
> internal, interim structure.
>
> So I thought, well, wouldn't it be nice if one could _change the class_ of 
> the MutableZTrees so they all magically turn into nice immutable ZTrees.
>
> I'm sure there's some trickery one could do, but quite what that trickery 
> would be, I'm not sure. Any ideas? (Or, just as importantly, good reasons why 
> the above is completely insane?) It would be nice to turn the O(3n) space 
> requirement into O(2n)...

You're looking for Behavior >> #adoptInstance:, but why would you bother 
with changing the class instead of adding the balancing protocol to ZTree?


Levente

>
> frank
>
>



More information about the Squeak-dev mailing list