2010-11-06 7 views
5

J'ai écrit un package pour Mathematica appelé MathOO. En bref, il vous permet d'utiliser l'orientation objet dans Mathematica comme vous le faites en Python. S'il vous plaît lire l'article suivant Voofie/MathOO pour plus de détails:Variables temporaires dans Mathematica

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

Le problème que je rencontrais est, je voudrais avoir éboueur, de sorte que l'utilisateur ne doit pas supprimer explicitement l'objet après l'avoir utilisé. Par exemple:

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

Dans les deux lignes ci-dessus, je viens de définir Object1 être une nouvelle classe, et le constructeur d'être une fonction vide. Si vous êtes familier avec Python, vous devriez voir la similarité avec __init__().

Pour instancier un Object1, je fais:

object1 = new[Object1][] 

La sortie est:

Out: object$13 

Ici, objet 13 $ est une variable temporaire. Ce que je veux, c'est quand il n'y a aucune référence à cette variable temporaire, il devrait être supprimé automatiquement. Mais cela ne fonctionne pas comme prévu. J'ai identifié le problème à être les suivants:

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 

Puisque y détient une référence de x 117 $, donc x 117 $ n'est pas supprimé encore. Maintenant, nous allons supprimer la référence en définissant la valeur de y à 1:

In: y = 1; 

Cependant, x 117 $ est toujours là:

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

Mais j'attend la variable à supprimer car il n'est plus référencé . De l'manual de Mathematica, il a dit:

symboles temporaires sont supprimés si elles ne sont plus référencés:

Alors, est-ce un bug de Mathematica? Ou y a-t-il des méthodes de contournement? J'utilise Mathematica 7.0. Merci beaucoup.

+0

Voir [cette réponse] (http: // stackoverflow.com/questions/6867892/reducing-memory-usage-in-an-extended-mathematica-session/6873142#6873142) pour certains bogues dans le garbage collector liés à 'Module'. –

Répondre

2

Mathematica ne fait rien de vrai poubelle Temporary lorsqu'il n'y a plus de références. Cela dit, il y a deux raisons pour lesquelles votre $ 117 n'est pas collecté.

  1. Rappelez-vous que Module utilise une portée lexicale, donc les variables du module ne sont que « local » dans le sens où ils sont donner un nom unique « var $ Modnum » et le TemporaryAttribute. Depuis que vous avez donné votre x un DownValue, il doit être effacé avant que x puisse être collecté. Votre y a été défini comme étant la variable temporaire x$... et la sortie a été affectée à Out[]. Vous devez également effacer l'historique: Unprotect[In, Out]; Clear[In, Out]; Protect[In, Out];.

Ensuite, votre exemple Module semble être correctement récupéré.


Lorsque vous utilisez votre forfait MathOO (que j'ai téléchargé hier, mais ne l'ai pas joué avec encore), vous pouvez peut-être juste régler le $HistoryLength à un certain nombre fini. et recommande que les utilisateurs suppriment la sortie de instanciations object1 = new[Object1][];

+0

Oui. Pour le 2ème point, je supprimerais normalement la sortie. J'ai omis le; juste pour que le programme affiche le nom de la variable afin que je puisse voir sa définition plus tard. Maintenant, le principal problème est que, je ne sais pas quand l'utilisateur ne fera aucune référence, et DownValue est un must. Est-ce DownValue est une autre référence qui est en dehors de la portée de x? Je ne voulais pas effacer le DownValue, et j'espère qu'il peut toujours être récupéré. – Ross

+0

Je voudrais utiliser la variable comme un dictionnaire. Comme dict en Python. Quand il n'y a pas de référence à la variable, DownValue n'a aucune signification du tout, et devrait donc être collectée. Je ne comprends pas pourquoi Mathematica ne le collecte pas et pense que je veux toujours l'utiliser après. – Ross

+1

Notez que la suppression de la sortie avec ';' n'empêche pas l'affectation de la valeur de retour réelle 'Out [n]'. –

1

Mathematica est un système de réécriture de chaîne (en bas) (sorte de) (pas vraiment) (mais vraiment) (Anyway ...) Le DownValue « x 117 $ [1] = 2 "est une règle de réécriture de chaîne qui n'est pas entièrement imprécise à imaginer est une entrée dans un tableau associatif. Le tableau est nommé "x $ 117" et l'entrée est la paire {1,2}. Tant qu'il y a une entrée dans le tableau, le symbole "x $ 117" est référencé et ne sera pas GCed par Mma.

Votre meilleur pari est de supprimer les symboles [] lorsqu'ils sont détruits ou sortent de la portée. (Clear [] est insuffisant car les attributs persistants, les messages ou les valeurs par défaut associés aux symboles ne sont pas éliminés par Clear [] et donc Mma conserve toujours des références dynamiques au symbole.)