3
在共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組))是調用 這裏應該調用相應的任務組
(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。