LINUX.ORG.RU

История изменений

Исправление 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.

Занавес.