今日の勉強

On Lisp
p368からp386

CLOSメモ
defclassでクラスを定義する。


(defclass circle ()
(radius center))
radiusとcenterは属性

make-instanceでインスタンスを作成する

例.(make-instance 'shape)

:accessorでアクセサ関数を定義することができる。


例.(defclass circle ()
((radius :accessor circle-radius)
(center :accessor circle-center)))
値を設定するにはsetfを使う。

例.(setf (circle-radius (make-instance 'circle)) 2)

:initargでインスタンス作成時に初期化ができる


例.(defclass circle ()
((radius :accessor circle-radius initarg :radius)
(center :accessor circle-center initarg :center)))

>(circle-radius (make-instance 'circle
:radius 2
:center '(0 . 0)))
2

:initformでデフォルトの値を設定できる


例.(defclass circle ()
((radius :accessor circle-radius initarg :radius :initform 2)
(center :accessor circle-center initarg :center)))

>(circle-radius (make-instance 'circle :center '(0 . 0)))
2

継承は


(defclass screen-circle (circle shape) nil) ;circleとshapeがスーパークラス
のように行う。CLOSは多重継承ができる。

:allpcation :classは、たぶんクラス変数を定義


例.(defclass owl ()
((nocturnal :accessor owl-nocturnal
:initform t
:allocation :class)))

defmethodでメソッドを定義する。


(defmethod area )((c circle))(
(* pi (expt (circle-radius c) 2)))
>(area (make-instance 'circle :radius 1))
3.14...
CLOSのメソッドはクラスから独立している

CLOSでも、bofore、after、aroundなどの補助メソッドが定義できる。