常见的Lisp多个元类

时间:2018-12-09 16:54:16

标签: common-lisp metaclass clos

最近发现了weblocks的活动分支,我想将其与ORM库mito结合使用。

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

defclass

与此同时,美图的工作方式如下:

(defclass my-class ()
  ((slot))
  (:metaclass weblocks/widgets/mop:widgets-class))

我该如何做到以下几点?

(defclass my-class ()
  ((...))
  (:metaclass mito:dao-table-class))

我尝试了继承,但是以某些不同的方式失败了。我只用了很短的时间就使用了CLOS。因此,我无法在频谱上进行测量

“我很愚蠢<=====>这是不可能的”

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

2 个答案:

答案 0 :(得分:8)

  

我尝试了继承,但是以某些不同的方式失败了。我只   短时间使用了CLOS。因此,我无法测量   光谱...

别担心,直接跳转到对CLOS缺乏经验的元对象当然是困难的,我建议您阅读元对象协议的艺术(Gregor Kiczales和Jim Des Rivieres的作品,也称为“ AMOP”)。 Robert Strandh在http://metamodular.com/CLOS-MOP上有第5章和第6章的HTML版本。

您要定义一个混合元类,该继承自这两个元类。

(defclass hybrid-metaclass (mito:dao-table-class
                            weblocks:widget-class)
  ())

如果使用上述元类定义一个类,则会出现以下警告:

;; 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

widget-class元类期望其所有类都继承自基类weblocks:widget

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

(defclass hybrid-widget (weblocks:widget) ()
  (:metaclass hybrid-metaclass))

这里,hybrid-widget继承自weblocks:widget,并具有元类hybrid-metaclass。您所有的窗口小部件都应继承自此类,并具有元类hybrid-metaclass(随时可以找到更好的名称)。

答案 1 :(得分:2)

即使有可能按照@coredump的建议进行解决,我也不建议您在一个类中混合使用模型(存储和业务逻辑)和小部件(这些对象的表示形式)。

通常,我用指向对象的插槽来定义我的小部件。这样,您还可以定义包含对象列表的小部件。当使每个单独的对象没有意义的小部件时,这很有用。

当您需要与其他块分开更新对象的表示形式以响应某些动作(例如,将任务标记为“完成”)时,只需在对象和小部件之间建立1-1链接即可。