Я написал пакет для Mathematica под названием MathOO. Короче говоря, это позволяет вам использовать объектную ориентацию в Mathematica точно так же, как в Python. Подробности см. в следующей статье на Voofie/MathOO:
Проблема, с которой я столкнулся, заключается в том, что я хотел бы иметь сборщик мусора, чтобы пользователю не приходилось явно удалять объект после его использования. Например:
NewClass[Object1]
Object1.$init$[self_]:= Return[];
В приведенных выше двух строках я только что определил Object1 как новый класс, а конструктор — как пустую функцию. Если вы знакомы с Python, вы должны увидеть сходство с __init__()
.
Чтобы создать экземпляр Object1, я делаю:
object1 = new[Object1][]
Результат:
Out: object$13
Здесь object$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
Но я ожидал, что переменная будет удалена, так как на нее больше не ссылаются. В руководстве по Mathematica сказано:
Временные символы удаляются, если на них больше не ссылаются:
Итак, это ошибка Mathematica? Или есть какие-то методы обхода? Я использую Mathematica 7.0. Большое Вам спасибо.
Module
. - person Alexey Popkov   schedule 16.08.2011