今日の勉強
On Lisp
p368からp386
CLOSメモ
defclassでクラスを定義する。
(defclass circle ()
(radius center))
radiusとcenterは属性
make-instanceでインスタンスを作成する
例.(make-instance 'shape)
:accessorでアクセサ関数を定義することができる。
値を設定するにはsetfを使う。
例.(defclass circle ()
((radius :accessor circle-radius)
(center :accessor circle-center)))
例.(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
継承は
のように行う。CLOSは多重継承ができる。
(defclass screen-circle (circle shape) nil) ;circleとshapeがスーパークラス
:allpcation :classは、たぶんクラス変数を定義
例.(defclass owl ()
((nocturnal :accessor owl-nocturnal
:initform t
:allocation :class)))
defmethodでメソッドを定義する。
CLOSのメソッドはクラスから独立している
(defmethod area )((c circle))(
(* pi (expt (circle-radius c) 2)))
>(area (make-instance 'circle :radius 1))
3.14...
CLOSでも、bofore、after、aroundなどの補助メソッドが定義できる。