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 会将类视为元类的实例(可以看作某种“高阶”对象系统或“双层”对象系统)。