2010-11-06 103 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仍然會保存對符號的實時引用。)