История изменений
Исправление den73, (текущая версия) :
То есть весь алгоритм будет вида «если в added-slots есть полярные координаты вычислим их из остальных (слоты + property-list), если появились ещё какие-то координаты, то вычислим их из уже вычисленных и т.д.
Я ж привёл пример по мотивам CLHS.
1.
(defclass x-y-position (position)
((x :initform 0 :accessor position-x)
(y :initform 0 :accessor position-y)))
Декартовы координаты x и y. Создадим объект p1(1,0) и забудем про него.
2.
(defclass x-y-position (position)
((rho :initform 0 :accessor position-rho)
(theta :initform 0 :accessor position-theta)))
Превращаем в полярные, ρ и r - переопределяем класс
3.
(defclass x-y-position (position)
((x :initform 0 :accessor position-x)
(y :initform 0 :accessor position-y)))
Надоели полярные, превращаем обратно в декартовы x и y, но повёрнутые относительно версии 1 на 90. Т.е., объект, к-рый в первой версии хранил (1,0) должен теперь хранить (0,1). Создадим объект p3(1,0) и забудем про него.
4. Превращаем опять в полярные ρ и r, ибо надоело.
5. Опять надоело, превращаем в декартовы и ещё на 90 поворачиваем. Т.е., если объект в версии 3 хранил 1,0, то он станет 0,1. Если он был в версии 1 1,0, то он станет -1,0.
А теперь - опа! Вспоминаем про объекты p1 и p3 и обращаемся к ним. Они пытаются проапгредиться. В качестве множеств изменённых слотов придёт пустота. И мы не сможем в update-instance-for-redefined-class понять, к какой версии относятся эти объекты, 1, 3 или 5.
Занавес.
Исходная версия den73, :
То есть весь алгоритм будет вида «если в added-slots есть полярные координаты вычислим их из остальных (слоты + property-list), если появились ещё какие-то координаты, то вычислим их из уже вычисленных и т.д.
Я ж привёл пример по мотивам CLHS.
1. Декартовы координаты x и y. Создадим объект p1(1,0) и забудем про него.
2. Превращаем в полярные, ρ и r - переопределяем класс.
3. Надоели полярные, превращаем обратно в декартовы x и y, но повёрнутые относительно версии 1 на 90. Т.е., объект, к-рый в первой версии хранил (1,0) должен теперь хранить (0,1). Создадим объект p3(1,0) и забудем про него.
4. Превращаем опять в полярные ρ и r, ибо надоело.
5. Опять надоело, превращаем в декартовы и ещё на 90 поворачиваем. Т.е., если объект в версии 3 хранил 1,0, то он станет 0,1. Если он был в версии 1 1,0, то он станет -1,0.
А теперь - опа! Вспоминаем про объекты p1 и p3 и обращаемся к ним. Они пытаются проапгредиться. В качестве множеств изменённых слотов придёт пустота. И мы не сможем в update-instance-for-redefined-class понять, к какой версии относятся эти объекты, 1, 3 или 5.
Занавес.