Mathematica中的临时变量

Ros*_*oss 5 python oop wolfram-mathematica

我为Mathematica编写了一个名为MathOO的软件包.简而言之,它允许您在Mathematica中使用面向对象,就像在Python中一样.有关详细信息,请阅读Voofie/MathOO中的以下文章:

MathOO:使用MathOO向Mathematica添加Python风格的对象方向(1.0 beta发布)[Objectica的替代方案]

我遇到的问题是,我想要垃圾收集器,以便用户在使用它之后不必显式删除该对象.例如:

NewClass[Object1]
Object1.$init$[self_]:= Return[];
Run Code Online (Sandbox Code Playgroud)

在上面的两行中,我只是将Object1定义为一个新类,将构造函数定义为一个空函数.如果你熟悉Python,你应该看到它的相似性__init__().

要实例化Object1,我这样做:

object1 = new[Object1][]
Run Code Online (Sandbox Code Playgroud)

输出是:

Out: object$13
Run Code Online (Sandbox Code Playgroud)

这里,对象$ 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
Run Code Online (Sandbox Code Playgroud)

由于y持有x 117美元的参考,因此x $ 117尚未被删除.现在让我们通过将y的值设置为1来删除引用:

In:  y = 1;
Run Code Online (Sandbox Code Playgroud)

但是,x $ 117仍然在这里:

In:  Definition[x$117]
Out: Attributes[x$117] = {Temporary}
     x$117[1] = 2
Run Code Online (Sandbox Code Playgroud)

但我预计变量将被删除,因为它不再被引用.从Mathematica 的手册中,它说:

如果不再引用临时符号,则将其删除:

那么,这是Mathematica的一个错误吗?或者有任何解决方法吗?我正在使用Mathematica 7.0.非常感谢你.

Sim*_*mon 2

Temporary当变量不再有引用时,Mathematica 确实会进行垃圾收集。也就是说,您的 x$117 没有被垃圾回收有两个原因。

  1. 请记住,它Module使用词法作用域,因此模块变量只是“本地”,因为它们被赋予唯一的名称“var$modnum”并且Temporary Attribute. 由于您提供了xa DownValue,因此必须先将其清除,然后x才能进行垃圾收集。

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

那么你的Module例子似乎被正确地垃圾收集了。


当使用你的 MathOO 包(我昨天下载的,但还没有玩过)时,也许你可以将 设为$HistoryLength某个有限的数字。并建议用户抑制实例化的输出object1 = new[Object1][];