Common Lisp 对象系统

Common Lisp 对象系统是 Common Lisp 面向对象编程系统。最初以宏的形式为 Common Lisp 做了实现,但之后在标准化时已经合并到这门语言中。

好处

据 Peter Norvig 称,借助 CLOS,“23 种模式中,16 种在 Lisp 或 Dylan 中的实现都比在 C++ 中简单”1。例如,圆与椭圆问题,可以直接调用对象来进行类切换。

示例

简单示例

(defclass <ship> ()
  ((name :reader name   ;; Only reader is implemented, so you can't rename a
                        ;; ship
         :initarg :name
         :type string)
   (kind :accessor kind
         :initarg :kind)
   (tonnage :accessor tonnage
            :initarg :tonnage
            :type float)))

(defparameter *my-ship*
              (make-instance '<ship> :name "USS Walter Mondale"
                                     :kind :laundry-ship
                                     :tonnage 345))

(class-of *my-ship*) ;; => #<standard-class <ship>>

通用函数

元对象协议

元对象协议 (MOP) 提供了扩展 CLOS 的机制,可以通过自定义其对某些类的行为来扩展 CLOS。基本上,MOP 会将类视为元类的实例(可以看作某种“高阶”对象系统或“双层”对象系统)。

引用