Можно ли динамически добавить еще один супер класс в существующий класс



В Common-Lisp CLOS



Можно ли динамически добавить еще один суперкласс
в существующем классе.



Обновление:



Я хотел определить defassoc вид макроса, который будет ассоциировать некоторое поведение
с помощью метода / функции, использующей тот же аргумент



Например



(defassoc (gname (s (g group)))
((name1 (name ((corresponding-task task g) s)))
(record1 (record ((corresponding-task task g) s))))
(let ((n name1)
(r record1))
(if (and name1 record1)
(display name1 record1)
(call-next-method))))


Расширить до



(symbol-macrolet ((name1 (name ((corresponding-task task g) s)))
(record1 (record ((corresponding-task task g) s))))
(defmethod gname :after (s (g group))
(let ((n name1) (r record1))
(if (and name1 record1)
(display name1 record1)
(call-next-method)))))


Здесь это сделать когда-нибудь (gname (с (Группа G)) - это вызов
здесь должен быть вызов для соответствующего задания группе



(name ((corresponding-task task g) s)
(record ((corresponding-task task g) s)


Я использовал это макрос



(defmacro defassoc ((main-method main-method-lambda-list)
funspec-list &body body)
`(symbol-macrolet ,(mapcar (lambda (fspec)
(destructuring-bind (name f) fspec
(list name f)))
funspec-list)
(defmethod
,main-method ,mod ,main-method-lambda-list
,@(if body
body
`(if (and
,@(mapcar (lambda (e)
(car e))
funspec-list))
(call-next-method)))))


Но проблема в том, что он перепишет



(defmethod gname :after (s (g group))
...)


(если он есть, я могу проверить, есть ли он или нет,)



Но я хочу, чтобы он работал для любого объекта, имеет ли он этот метод перезаписи или нет



Так что в принципе это должно быть необходимо, чтобы изменить в коде для любой вещи в этих классах и методах.



Так что одним из способов я решил, что динамически добавить родительский класс, чтобы определить этот метод на нем.



Другой путь может быть defadvide или fwrapper , но его нет в SBC.

518   1  

1 ответ:

Да, это возможно. Проще всего было бы просто переопределить класс. Вы делаете это, посылая другой вызов DEFCLASS. Если вы хотите делать более сложные вещи, вам придется прибегнуть к протоколу MOP (MetaObject Protocol). По существу, все, что вы когда-либо хотели бы сделать, возможно с помощью швабры, но мне нужна более подробная информация о том, что вы пытаетесь сделать, чтобы объяснить это дальше.

Comments

    Ничего не найдено.