2010-11-06 20 views
5

Ho scritto un pacchetto per Mathematica chiamato MathOO. In breve, ti permette di usare l'orientamento degli oggetti in Mathematica proprio come fai tu in Python. Si prega di leggere il seguente articolo Voofie/MathOO per i dettagli:Variabili temporanee in Mathematica

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

Il problema che ho incontrato è che, mi piacerebbe avere garbage collector, modo che l'utente non è necessario l'eliminazione in modo esplicito l'oggetto dopo averlo usato. Per esempio:

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

In queste due linee, ho appena definito Object1 essere una nuova classe, e il costruttore ad essere una funzione vuoto. Se hai familiarità con Python, dovresti vedere la somiglianza con __init__().

creare un'istanza di un Object1, lo faccio:

object1 = new[Object1][] 

L'output è:

Out: object$13 

Qui, oggetto $ 13 è una variabile temporanea. Quello che voglio è che, quando non ci sono riferimenti a questa variabile temporanea, dovrebbe essere cancellato automaticamente. Ma non funziona come previsto. Ho individuato il problema di essere la seguente:

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 

Poiché y contiene un riferimento di x $ 117, quindi x $ 117 non è ancora rimosso. Ora cerchiamo di eliminare il riferimento impostando il valore di y a 1:

In: y = 1; 

Tuttavia, X $ 117 è ancora qui:

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

ma mi aspettavo la variabile da rimuovere in quanto non è più referenziato . Dal manual di Mathematica, ha detto:

simboli temporanei vengono rimossi se non sono più referenziati:

Quindi, si tratta di un bug di Mathematica? O c'è qualche metodo di soluzione? Sto usando Mathematica 7.0. Grazie mille.

+0

Vedere [questa risposta] (http: // stackoverflow.com/questions/6867892/reducing-memory-usage-in-an-extended-mathematica-session/6873142#6873142) per alcuni bug nel garbage collector relativo a 'Module'. –

risposta

2

Mathematica raccoglie realmente le variabili Temporary quando non hanno più riferimenti. Detto questo, ci sono due ragioni per cui il tuo x $ 117 non viene raccolto.

  1. Ricordate che Module utilizza scoping lessicale, in modo che le variabili di modulo sono solo "locale", nel senso che essi sono dare un nome univoco "var $ modnum" e la TemporaryAttribute. Dato che hai dato il tuo x a DownValue, deve essere cancellato prima che x possa essere eliminato dalla garbage collection.

  2. Il è stato impostato come variabile temporanea x$... e l'output è stato assegnato a Out[]. Quindi è anche necessario cancellare la cronologia: Unprotect[In, Out]; Clear[In, Out]; Protect[In, Out];.

Quindi il tuo esempio Module sembra essere correttamente raccolto.


Quando si utilizza il pacchetto MathOO (che ho scaricato ieri, ma non ho giocato con ancora) forse si può solo impostare il $HistoryLength a qualche numero finito. e raccomandano che gli utenti sopprimono la produzione di istanze object1 = new[Object1][];

+0

Sì. Per il secondo punto, normalmente eliminerei l'output. Ho omesso il; solo per il programma per l'output del nome della variabile in modo che possa vedere la sua definizione più tardi. Ora, il problema principale è che, non so quando l'utente non farà riferimenti, e DownValue è un must. È che DownValue è un altro riferimento che è al di fuori dell'ambito di x? Semplicemente non voglio cancellare il DownValue e spero che possa ancora essere raccolto. – Ross

+0

Vorrei usare la variabile come dizionario. Come dict in Python. Quando non c'è alcun riferimento alla variabile, il valore di Down non ha alcun significato, e quindi dovrebbe essere garbage collection. Non capisco perché Mathematica non lo raccolga e pensa che voglio ancora usarlo in seguito. – Ross

+1

Nota che sopprimere l'output con ';' non impedisce l'assegnazione del valore di ritorno effettivo a 'Out [n]'. –

1

Mathematica è un sistema di stringa di riscrittura (in basso) (specie di) (non proprio) (ma veramente) (comunque ...) Il DownValue "x $ 117 [1] = 2 "è una regola di riscrittura delle stringhe che non è del tutto impreciso immaginare è una voce in un array associativo. L'array è denominato "x $ 117" e la voce è la coppia {1,2}. Finché c'è una voce nella matrice, il simbolo "x $ 117" è referenziato e GCed non sarà MMA.

La soluzione migliore è rimuovere i simboli [] quando vengono distrutti o vanno fuori dal campo di applicazione. (Clear [] non è sufficiente poiché gli attributi persistenti, i messaggi o i valori predefiniti associati ai simboli non vengono eliminati da Cancella [] e quindi Mma manterrà ancora riferimenti dal vivo al simbolo.)