In 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中不存在
是的,有可能。最简单的方法是简单地重新定义类。通过对DEFCLASS
发出另一个调用来实现。如果你想做更复杂的事情,你必须求助于MOP(元对象协议)。基本上,你想做的任何事情都可以使用MOP,但是我需要更详细的信息来了解你想做什么,以便进一步解释它。