Я написал пакет для 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. Большое спасибо.