2011-08-15 30 views
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)) 
     ...) 

(如果它有,我可以驗證它,如果它有一個或沒有)

但我想它對於它是否任何對象工作該方法是否覆蓋

因此,基本上應該需要在代碼中更改該類和方法中的任何東西。

所以一個辦法,我決定,動態地添加父類的定義就可以了這種方法。

其他方式可能是defadvidefwrapper,但它不存在於SBCL。

回答

3

是的,這是可能的。最簡單的方法是簡單地重新定義班級。您通過發出另一個電話DEFCLASS來做到這一點。如果你想做更復雜的事情,你不得不求助於MOP(元對象協議)。基本上,你想要做的所有事情都可以使用MOP,但我需要更詳細的信息來說明你想要做什麼以便進一步解釋它。

相關問題