Common Lisp Object System

Table of Contents

CLOS 提供了强度的面向对象能力。

1. 定义一个类

defclass

第二个参数指定基类

槽属性(如果是一个列表,可以指定属性)

:accessor:为槽定义一个访问的名字

:initform:make-instance 给定一个初始值

:initarg:make-instance 时通过关键字参数指定值,它的优先级比 :initform 要高

:writer:提供一个用来设置值的广义函数

:reader:它的参数将被定义为一个广义函数,用来取对应的值

:allocation :class: 所有对象都共享一个值

2. defmethod

定义方法,可以根据传入参数的类型动态调用,定义如下:

(defmethod name &rest args)

(defmethod add ((a number) (b number))
  (+ a b))

(defmethod add ((a list) (b list))
  (append a b))

(add 1 1)                               ; => 2
(add '(1 2) '(3 4))                     ; => (1 2 3 4)

辅助属性:

  • :before:相当于构造函数,序幕
  • :after:相当于析构函数,闭幕
  • :around 比:before优先级还高,并且还决定调用不调用:before

initialize-instance :after:相当于Python的_init__

访问槽(Slot):slot-value

新建一个对象:make-instance