Temporary variables in Mathematica
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:
MathOO: Adding Python style Object Orientation to Mathematica with MathOO (1.0 beta launch) [Alternative to Objectica]
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 =开发者_如何学JAVA 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 Temporary
variables when they have no more references. That said, there's two reasons that your x$117 is not garbage collected.
Remember that
Module
uses lexical scoping, so the module variables are only "local" in the sense that they are give a unique name "var$modnum" and theTemporary
Attribute
. Since you gave yourx
aDownValue
, it must be cleared beforex
can be garbage collected.Your
y
was 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 Module
example 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 $HistoryLength
to some finite number. And recommend that users suppress the output of instantiations object1 = new[Object1][];
Mathematica is a string rewriting system (at the bottom) (sort of) (not really) (but really) (ANYWAY...) The DownValue "x$117[1] = 2" is a string rewriting rule that it is not entirely inaccurate to imagine is an entry in an associative array. The array is named "x$117" and the entry is the pair {1,2}. As long as there is an entry in the array, the symbol "x$117" is referenced and will not be GCed by Mma.
Your best bet is to Remove[] symbols when they are destructed or go out of scope. (Clear[] is insufficient since lingering attributes, messages, or defaults associated with symbols are not eliminated by Clear[] and so Mma will still hold live references to the symbol.)
精彩评论