Common Lisp Object System
Common Lisp Object System(コモン リスプ オブジェクトシステム、
LISPにオブジェクト
![](https://upload.wikimedia.org/wikipedia/commons/4/43/Method-combination.png)
特徴
[多重 ディスパッチ
[CLOS は
弱 いカプセル化
[slot-value
データ
多重 継承
[CLOS は
動的 クラス変更
[CLOSでのオブジェクトのクラスは(change-class INSTANCE NEW-CLASS-NAME &rest INITARGS)
である。
また、CLOS はdefclass
を(make-instances-obsolete CLASS)
をmake-instances-obsolete
はupdate-instance-for-redefined-class
をupdate-instance-for-redefined-class
は
クラスベース
[CLOS はプロトタイプベースではない。インスタンスをあるクラスのメンバーとしてdefclass
によってそのクラスを
MOP : Meta Object Protocol
[ANSI Generic Function (class-slots class)
、Class standard-slot-definition
、など。
MOPは
実行 メソッドの形成
[適用 可能 メソッドを並 べる
[クラスperson
がクラスanimal
をperson
のインスタンスである。reaction
の
(reaction p1 p2)
について、メソッドが
(defmethod reaction ((a1 animal) (a2 animal)) (foo)) ; 1
(defmethod reaction ((a1 person) (a2 animal)) (bar)) ; 2
(defmethod reaction ((a1 animal) (a2 person)) (baz)) ; 3
(defmethod reaction ((a1 person) (a2 person)) (bab)) ; 4
クラス継承 順 によるメソッドの並 べ替 え
[これら4つのメソッドは、
メソッド結合 (メソッド・コンビネーション)
[CLOSでは、
super
という
メソッド:around
メソッド
standard メソッドコンビネーション / 標準 メソッド結合
[これはjavaのもつ
メソッド
+ メソッド結合
[これは、すべてのlist
,progn
,append
などがある。
max メソッド結合
[これは、すべてのmin
がある。
新 たなメソッド結合 の定義
[define-method-combination
[6]は、ユーザーに、
例
[クラス定義
[(defclass animal ()
((sex :reader sex-of :initarg :sex)))
;; 初期 値 を設定 するためのキーワード引数 を :sex に指定 する
(defclass named-mixin ()
((name :type string :reader name-of :initarg :name)))
;; 名前 を持 つオブジェクトのmixin
;; :reader 指定 により、スロット読 み出 し用 の関数 が自動 で定義 される
(defclass wild-dog (animal)
((food :initform :anything)))
(defclass pet-dog (animal named-mixin)
((food :initform :dog-food)))
;; :initformにより、インスタンス作成 時 に値 を設定 しない場合 の初期 値 を定 める
(defclass person (animal named-mixin)
((address :accessor adress-of)))
;; accessor指定 により、読 み書 き両方 の関数 が作 られる
(defclass male-mixin ()
((sex :initform :male)))
(defclass female-mixin ()
((sex :initform :female)))
(defclass stewardess (person female-mixin)
())
スタンダード・メソッドコンビネーション
[それぞれの
(defun say (sound)
(format t sound))
;; 標準 出力 に書 き込 む
(defgeneric saysomething (animal))
(defmethod saysomething ((ani animal))
(say "aaaaa!"))
;; 通常 、動作 は継承 により上書 きされる
(defmethod saysomething :before ((p person))
(say "hi!"))
;; :before 指定 により、子孫 クラスのメソッドをあとに続 いて実行 できる
(defmethod saysomething ((st stewardess))
(say "welcome aboard!"))
;; stewardess は person クラスを継承 するので、:before 指定 に従 い
;; hi! と言 った後 に welcome aboard! という
list メソッドコンビネーション
[list
メソッドコンビネーションを
(defgeneric reaction (of to)
(:method-combination :list))
;; 第 一 引数 がとる第 二 引数 への反応 を返 す。
;; メソッド結合 をstandardからlistへ変更 する。
;; そのため、それぞれのメソッドの返 り値 がlistにまとめられて返 る
(defmethod reaction list ((a1 animal) (a2 animal))
:look)
(defmethod reaction list ((a1 wild-dog) (a2 wild-dog))
(if (in-same-group a1 a2)
:sniff ;; くんくん嗅 ぐ
:bark)) ;; 吠 える
(defmethod reaction list ((wild wild-dog) (pet pet-dog))
:bark-strongly)
(defmethod reaction list ((pet pet-dog) (wild wild-dog))
:run-away)
(defmethod reaction list ((pet pet-dog) (p person))
:escort)
(defmethod reaction list ((p person) (pet pet-dog))
:go-for-a-walk)
(defmethod reaction list ((p1 person) (p2 person))
:greetings)
(defmethod reaction list ((st stewardess) (p person))
:welcome-aboard)
(defmethod reaction list ((f1 female-mixin) (p person))
:watch-clothes)
(defmethod reaction list ((m male-mixin) (f female-mixin))
:watch-hip-tits-and-waist)
(reaction (make-instance 'animal)
(make-instance 'animal))
;; --> (:LOOK)
(reaction (make-instance 'man)
(make-instance 'stewardess))
;; --> (:GREETINGS :LOOK :WATCH-HIP-TITS-AND-WAIST)
(reaction (make-instance 'stewardess)
(make-instance 'man))
;; --> (:WELCOME-ABOARD :GREETINGS :LOOK :WATCH-CLOTHES)
(reaction (make-instance 'wild-dog)
(make-instance 'man))
;; --> (:LOOK)
(reaction (make-instance 'pet-dog)
(make-instance 'man))
;; --> (:ESCORT :LOOK)
(reaction (make-instance 'pet-dog)
(make-instance 'wild-dog))
;; --> (:RUN-AWAY :LOOK)
参考 文献
[- "CommonLoops: merging Lisp and object-oriented programming", by Daniel G. Bobrow, Kenneth Kahn, Gregor Kiczales, Larry Masinter, Mark Stefik, Frank Zdybel. 1986, Portland, Oregon, United States. Pages 17 - 29 of the Conference on Object Oriented Programming Systems Languages and Applications, ISSN 0362-1340.
- "A History and Description of CLOS", by Jim Veitch. Pages 107-158 of Handbook of Programming Languages, Volume IV: Functional and Logic Programming Languages, ed. Peter H. Salus. 1998 (1st edition), Macmillian Technical Publishing; ISBN 1-57870-011-6
- Gregor Kiczales, Jim des Rivieres, and Daniel G. Bobrow, The Art of the Metaobject Protocol, 1991, MIT Press. ISBN 0-262-61074-4
- Sonya Keene, Object-Oriented Programming in Common Lisp: A Programmer's Guide to CLOS, 1988, Addison-Wesley. ISBN 0-201-17589-4.
脚注
[- ^ 「CLOS は
標準 規格 である。複数 のベンダーがCLOSを提供 している。CLOS やその一部 は他 のLISP系 言語 である EuLisp や EmacsLisp にオブジェクト指向 を導入 するのに使 われている」 p. 110 (Veitch 1998) - ^ p. 108 (Veitch 1998)
- ^ http://www.cliki.net/Current%20recommended%20libraries
- ^ ただし、このオプションは
defgeneric
の:argument-precedence-order
というオプションによって逆順 に変更 できる。 - ^ http://www.lispworks.com/documentation/HyperSpec/Body/07_ffab.htm
- ^ http://www.lispworks.com/documentation/HyperSpec/Body/m_defi_4.htm#define-method-combination
外部 リンク
[- The Common Lisp Object System: An Overview by Richard P. Gabriel and Linda DeMichiel
- Common Lisp HyperSpec, Chapter 7: Objects