2010-11-06 127 views
5

我已经为Mathematica编写了一个名为MathOO的包。简而言之,它允许您在Mathematica中使用对象方向,就像在Python中一样。请阅读下面的文章中为Voofie/MathOO细节:Mathematica中的临时变量

MathOO: Adding Python style Object Orientation to Mathematica with MathOO (1.0 beta launch) [Alternative to Objectica]

我遇到的问题是,我想有垃圾回收器,使用户不必使用后,明确地删除对象。例如:

NewClass[Object1] 
Object1.$init$[self_]:= Return[]; 

在上述两条线,我刚刚定义Object1是一个新的类,并构造为一个空函数。如果您熟悉Python,则应该看到与__init__()的相似性。

实例化一个Object1,我做的:

object1 = new[Object1][] 

输出是:

Out: object$13 

这里,对象$ 13是一个临时变量。我想要的是,当没有对这个临时变量的引用时,它应该被自动删除。但它不能按预期工作。我发现问题如下:

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 

由于y持有x $ 117的引用,所以x $ 117尚未删除。现在,让我们通过设定y的值删除对1参考:

In: y = 1; 

然而,X $ 117还在这里:

In: Definition[x$117] 
Out: Attributes[x$117] = {Temporary} 
    x$117[1] = 2 

但我预计要删除的变量,因为它不再被引用。从数学的manual,它说:

所以,它是数学的一个错误:如果他们不再被引用

临时符号已经被移除?或者是否有任何解决方法?我正在使用Mathematica 7.0。非常感谢你。

+0

请参见[本答案](http:// stackoverflow.com/questions/6867892/reducing-memory-usage-in-an-extended-mathematica-session/6873142#6873142)查看与'Module'相关的垃圾收集器中的一些错误。 – 2011-08-16 13:13:56

回答

2

Mathematica确实没有垃圾收集Temporary变量时,他们没有更多的引用。也就是说,有两个原因,您的x 117美元不是垃圾收集。

  1. 记住Module使用词汇范围,因此模块变量是在这个意义上,他们是一个唯一的名称“变量$ modnum”和TemporaryAttribute只是“局部”。 既然你给了你的x一个DownValue,它必须清理之前,x可以垃圾收集。

  2. 您的y被设置为临时变量x$...,输出被分配到Out[]。所以你还需要清除历史记录:Unprotect[In, Out]; Clear[In, Out]; Protect[In, Out];

然后你的Module例子似乎被正确地垃圾收集。


当使用MathOO包(我昨天下载了,但还没有与玩过没)也许你可以只设置$HistoryLength一些有限数量。 并建议用户抑制实例的输出 object1 = new[Object1][];

+0

是的。对于第二点,我通常会压制输出。我省略了;只是为了让程序输出变量名,以便稍后可以看到它的定义。现在,主要的问题是,我不知道用户什么时候不做引用,并且DownValue是必须的。那个DownValue是另一个超出x范围的参考吗?我只是不想清除DownValue,并希望它仍然可以被垃圾收集。 – Ross 2010-11-07 02:51:59

+0

我想将该变量用作字典。就像Python中的dict一样。当没有对变量的引用时,DownValue根本就没有意义,所以应该进行垃圾收集。我不明白为什么Mathematica不收集它,并认为我仍然想在以后使用它。 – Ross 2010-11-07 02:57:14

+1

请注意,使用';'来抑制输出并不妨碍将实际返回值赋值给'Out [n]'。 – 2010-11-07 21:39:40

1

数学是一个字符串重写系统(底部)(排序)(不是真的)(但实际上)(反正...)的DownValue“X $ 117 [1] = 2“是一个字符串重写规则,它并不是完全不准确的想象是一个关联数组中的条目。该数组被命名为“x $ 117”,并且条目是对{1,2}。只要数组中有一个条目,就会引用符号“x $ 117”,并且不会被Mma GCG。

最好的办法就是当它们被破坏或超出范围时移除[]符号。 (Clear []是不够的,因为延迟的属性,消息或与符号相关的默认值不会被Clear []消除,因此Mma仍然会保存对符号的实时引用。)