共通-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,但它并不存在于SBCL中。
发布于 2011-08-15 15:40:10
是的,有可能。最简单的方法是简单地重新定义类。您可以通过向DEFCLASS发出另一个调用来做到这一点。如果您想做更复杂的事情,您必须求助于MOP (MetaObject协议)。基本上,你想做的每件事都可以使用拖把,但我需要更详细的信息,你想要做什么,以进一步解释它。
https://stackoverflow.com/questions/7066604
复制相似问题