是否可以在现有的类中动态添加一个超类?



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))
      ...)

(如果有,我可以验证它是否有)

但是我想让它适用于任何对象不管它是否有那个方法被覆盖

所以基本上应该需要在代码中更改类和方法中的任何东西

所以我决定动态地添加父类来定义这个方法。

其他方法可以是defadvidefwrapper,但在SBCL中不存在

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

相关内容

  • 没有找到相关文章

最新更新