I have written a package for Mathematica called MathOO. In short, it allows you to use object orientation in Mathematica just like you do in Python. Please read the following article in Voofie/MathOO for details:
The problem I encountered is that, I would like to have garbage collector, so that user don’t have to explicitly deleting the object after using it. For instance:
NewClass[Object1]
Object1.$init$[self_]:= Return[];
In the above two lines, I just defined Object1 to be a new class, and the constructor to be an empty function. If you are familiar with Python, you should see the similarity with __init__().
To instantiate an Object1, I do:
object1 = new[Object1][]
The output is:
Out: object$13
Here, object$13 is an temporary variable. What I want is, when there are no references to this temporary variable, it should be deleted automatically. But it doesn’t work as expected. I have identified the problem to be the following:
In: y = Module[{x}, x[1] = 2; x]
Out: x$117
In: FullDefinition[y]
Out: y = x$117
Attributes[x$117] = {Temporary}
x$117[1] = 2
Since y holds a reference of x$117, so x$117 is not removed yet. Now let’s delete the reference by setting the value of y to 1:
In: y = 1;
However, x$117 is still here:
In: Definition[x$117]
Out: Attributes[x$117] = {Temporary}
x$117[1] = 2
But I expected the variable to be removed since it is no longer referenced. From the manual of Mathematica, it said:
Temporary symbols are removed if they are no longer referenced:
So, is it a bug of Mathematica? Or is there any workaround methods? I am using Mathematica 7.0. Thank you very much.
Mathematica really does garbage collects
Temporaryvariables when they have no more references. That said, there’s two reasons that your x$117 is not garbage collected.Remember that
Moduleuses lexical scoping, so the module variables are only “local” in the sense that they are give a unique name “var$modnum” and theTemporaryAttribute.Since you gave your
xaDownValue, it must be cleared beforexcan be garbage collected.Your
ywas set to be the temporary variablex$...and the output was assigned toOut[]. So you also need to clear the history:Unprotect[In, Out]; Clear[In, Out]; Protect[In, Out];.Then your
Moduleexample seems to be properly garbage collected.When using your MathOO package (that I downloaded yesterday, but haven’t played with yet) maybe you can just set the
$HistoryLengthto some finite number.And recommend that users suppress the output of instantiationsobject1 = new[Object1][];