我为Mathematica编写了一个名为MathOO的软件包。简而言之,它允许您在Mathematica中使用面向对象,就像在Python中一样。有关详细信息,请阅读Voofie/MathOO中的以下文章:
我遇到的问题是,我想拥有垃圾收集器,因此用户在使用它之后不必显式删除该对象。例如:
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
但我希望删除该变量,因为它不再被引用。来自Mathematica的manual,它说:
如果不再引用临时符号,则删除它们:
那么,这是Mathematica的错误吗?或者有任何解决方法吗?我正在使用Mathematica 7.0。非常感谢你。
答案 0 :(得分:2)
当Mathematica没有更多引用时,他们确实会收集Temporary
个变量。也就是说,有两个原因使你的x $ 117不是垃圾收集。
请记住Module
使用词法作用域,因此模块变量只是“本地”,因为它们给出了一个唯一的名称“var $ modnum”和Temporary
{{ 1}}。
由于您向Attribute
提供了x
,因此必须先将其清除,然后才能对DownValue
进行垃圾回收。
您的x
已设置为临时变量y
,输出已分配给x$...
。因此,您还需要清除历史记录:Out[]
。
然后,您的Unprotect[In, Out]; Clear[In, Out]; Protect[In, Out];
示例似乎已正确收集垃圾。
使用你的MathOO软件包(我昨天下载但尚未玩过)时,你可以将Module
设置为某个有限数字。并建议用户禁止实例化的输出$HistoryLength
击>
答案 1 :(得分:1)
Mathematica是一个字符串重写系统(在底部)(有点)(不是真的)(但是真的)(ANYWAY ...)DownValue“x $ 117 [1] = 2”是一个字符串重写规则,它想象是关联数组中的条目并不完全不准确。该数组名为“x $ 117”,条目为{1,2}对。只要数组中有一个条目,就会引用符号“x $ 117”并且不会被Mma GC。
最好的办法是在符号被破坏或超出范围时删除[]符号。 (Clear []是不够的,因为Clear []不会消除与符号相关的延迟属性,消息或默认值,因此Mma仍会保留对符号的实时引用。)