Common Lisp Multiple Metaclasses

oty*_*tyn 4 metaclass common-lisp clos

最近发现了一个活跃的weblocks分支,我想将它与ORM库mito结合起来.

Weblocks定义了一个宏defwidget,它实际上defclass就像这样包装:

(defclass my-class ()
  ((slot))
  (:metaclass weblocks/widgets/mop:widgets-class))
Run Code Online (Sandbox Code Playgroud)

同时美图的工作原理如下:

(defclass my-class ()
  ((...))
  (:metaclass mito:dao-table-class))
Run Code Online (Sandbox Code Playgroud)

我怎样才能使以下工作?

(defclass my-class ()
  (...))

(defvar *obj* (make-instance 'my-class))

(render *obj*) ;render from weblocks

(save-dao *obj*) ;save-dao from mito

(my-method *obj*)
Run Code Online (Sandbox Code Playgroud)

我尝试过继承,但以某种不同的方式失败了.我在短时间内只使用过CLOS.因此,我无法测量频谱的位置

"我很蠢<=====>这是不可能的"

我站着.任何帮助,将不胜感激.

cor*_*ump 8

我尝试过继承,但以某种不同的方式失败了.我在短时间内只使用过CLOS.因此,我无法衡量频谱的位置......

不要担心,直接跳到对CLOS缺乏经验的元对象肯定是困难的,我建议阅读Metaobject协议的艺术,(也称为"AMOP",由Gregor Kiczales和Jim Des Rivieres).Robert Strandh在http://metamodular.com/CLOS-MOP上有第5章和第6章的HTML版本.

您想要定义一个从两个元类继承的混合元类.

(defclass hybrid-metaclass (mito:dao-table-class
                            weblocks:widget-class)
  ())
Run Code Online (Sandbox Code Playgroud)

如果使用上面的元类定义一个类,则会出现此警告:

;; WARNING: #<HYBRID-METACLASS COMMON-LISP-USER::MY-WIDGET {100B8FE683}> is not
;; defined to be a subclass of WEBLOCKS:WIDGET; consider adding WEBLOCKS:WIDGET
;; or a subclass thereof to the superclass list
Run Code Online (Sandbox Code Playgroud)

widget-class元类期望其所有的类从基类继承,weblocks:widget.

让我们为混合元类定义这样一个基础对象:

(defclass hybrid-widget (weblocks:widget) ()
  (:metaclass hybrid-metaclass))
Run Code Online (Sandbox Code Playgroud)

在这里,hybrid-widget继承自weblocks:widget并且具有元类hybrid-metaclass.你的所有小部件都应该从这个类继承并拥有元类hybrid-metaclass(随意找到一个更好的名字).