Временные переменные в Mathematica - PullRequest
5 голосов
/ 06 ноября 2010

Я написал пакет для Mathematica под названием MathOO. Короче говоря, он позволяет вам использовать ориентацию объектов в Mathematica так же, как в Python. Пожалуйста, прочитайте следующую статью в Voofie / MathOO для деталей:

MathOO: добавление объектной ориентации в стиле Python к Mathematica с помощью MathOO (запуск 1.0 бета) [Альтернатива 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;

Однако, $ 117 все еще здесь:

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

Но я ожидал, что переменная будет удалена, поскольку на нее больше нет ссылок. Из руководства Mathematica сказано:

Временные символы удаляются, если на них больше нет ссылок:

Итак, это ошибка Mathematica? Или есть какие-нибудь обходные методы? Я использую Mathematica 7.0. Большое спасибо.

Ответы [ 2 ]

2 голосов
/ 07 ноября 2010

Mathematica действительно собирает Temporary переменные, когда у них больше нет ссылок. Тем не менее, есть две причины, по которым ваши x $ 117 не являются сборщиком мусора.

  1. Помните, что Module использует лексическую область видимости, поэтому переменные модуля являются только "локальными" в том смысле, что им присваивается уникальное имя "var $ modnum" и Temporary Attribute. Поскольку вы дали x a DownValue, его необходимо очистить, прежде чем x можно будет собрать мусором.

  2. Ваш y был задан как временная переменная x$..., а вывод был присвоен Out[]. Поэтому вам также необходимо очистить историю: Unprotect[In, Out]; Clear[In, Out]; Protect[In, Out];.

Тогда ваш Module пример выглядит правильно собранным.


При использовании вашего пакета MathOO (который я скачал вчера, но еще не играл с ним), возможно, вы можете просто установить $HistoryLength на некоторое конечное число. И порекомендовать пользователям подавлять вывод экземпляров object1 = new[Object1][];

1 голос
/ 10 ноября 2010

Mathematica - это система перезаписи строк (внизу) (вроде) (не совсем) (но реально) (ВСЕГДА ...) DownValue "x $ 117 [1] = 2" - это правило перезаписи строк, которое Не совсем неточно представить себе запись в ассоциативном массиве. Массив называется «x $ 117», а запись - это пара {1,2}. Пока в массиве есть запись, на символ "x $ 117" ссылаются, и Mma не будет GCed.

Лучше всего удалять символы [], когда они уничтожены или выходят за рамки. (Очистить [] недостаточно, поскольку устаревшие атрибуты, сообщения или значения по умолчанию, связанные с символами, не удаляются очисткой [], и поэтому Mma будет по-прежнему хранить живые ссылки на символ.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...