在 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 (s (g group)) 应该调用相应的任务到组
(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但它不存在于 SBCL 中。