Dear forum,
I have some questions obout mutable and immutable objects
here is the declarations/implementations of MyObj
DeclareCategory("IsMyObj", IsObject);
DeclareRepresentation( "IsMyRep", IsAttributeStoringRep, [ "x" ] );
DeclareGlobalFunction( "MyObj" );
InstallGlobalFunction( MyObj,
function(y)
local Fam;
Fam:= NewFamily( "MyFamily", IsMyObj );
return Objectify( NewType( Fam, IsMyObj and IsMyRep ), Immutable(rec ( x := y )) ); end); gap> elem := MyObj([11..15]); <object> gap> IsMutable(elem); false gap> IsMutable(elem!.x); false gap> elem!.x[1] := 21; # -> Error: Lists Assignment: <list> must be a mutable list # that error is ok, because the list is not mutable gap> elem!.x := 21; 21 # but why this? the underlying rec was made immutable gap> elem!.y := "hallo"; "hallo" # or why is this possible? gap>
Here is my first question:
how to make sure, my object is really immutable?
gap> elem1:=StructuralCopy(elem); <object> gap> IsIdenticalObj(elem, elem1); true # of course, IsMutable returns false, so # StructuralCopy returns the object itself gap> elem1!.x :=22; 22 gap> elem!.x; elem1!.x; 22 22 gap>
Here is my second question:
how to make an object mutable, and bring StructuralCopy to
return a *new* copy of the object
here is an answer (is this the right one?):
Install other function for "MyObj".
This one returns mutable objects and StructuralCopy returns realy
new objects
InstallGlobalFunction( MyObj,
function(y)
local Fam;
Fam:= NewFamily( "MyFamily", IsMyObj );
return Objectify( NewType( Fam, IsMyObj and IsMutable and IsMyRep ), rec ( x := y ) ); end);
gap> elem := MyObj([11..15]);
<object>
gap> IsMutable(elem);
true
gap> IsMutable(elem!.x);
true
gap> MakeImmutable(elem);
gap> IsMutable(elem);
false
gap> IsMutable(elem!.x);
true
gap>
but here is my third question:
how to make MakeImmutable return a really immutable object
I would write my own function MyMakeImmutable (AFAIK it is
not possible to override global functions like operations
depending on the type of the arguments).
But this wouldn't be a fine programming style and
this returns us to the first question:
how to make sure, my object is really immutable?
Thanks in advance
Sergei
-------------------------------------------------------------------- eMail: Sergei.Haller@math.uni-giessen.de WWW-page: http://www.hrz.uni-giessen.de/~gc1007/ -------------------------------------------------------------------- Be careful of reading health books, you might die of a misprint. -- Mark Twain