Next: 15.2 クラス定義の実現
Up: 15 CLOSのクラスシステムの実現
Previous: 15 CLOSのクラスシステムの実現
クラスを表現するために構造体を用います.
構造体の要素にはクラスを表現するために必要なデータを蓄えるための
ものを用意しておきます.
ここでは,クラスの名前(name),インスタンス変数(local-variables),メソッ
ド表(functions),親クラス(parent)があります.
(defstruct cls
(name nil)
(local-variables nil)
(accessors nil)
(functions (make-hash-table))
(parents nil))
;;;
(defvar *all-classes* nil)
(defvar *verbose* t)
;;;
(defun initialize-cls-system ()
(if *all-classes* (clrhash *all-classes*)
(setf *all-classes* (make-hash-table)))
(setf (gethash t *all-classes*) (make-cls :name t)))
;;;
;;;
(initialize-cls-system)
;;;
クラスを定義するdefclassが行なうことは,クラスの構造体データをひとつ作
り,それを大域変数*all-classes*に代入されているハッシュ表にクラス名を
キーにして蓄えます.
クラス名を与えて,クラスが定義されているかを調べる関数defined-class?,
クラス名とクラスの実体を登録する関数store-class
クラス名をあたえて,クラスの実体を取り出す関数get-classは以下のように
なる.
(defun defined-class? (cls-name)
(gethash cls-name *all-classes*))
;;;
(defun store-class (cls-name class)
(if *verbose*
(format t "; class ~a defined under ~a.~%"
cls-name (cls-parents class)))
(setf (gethash cls-name *all-classes*) class)
)
(defun get-class (cls-name)
(cond
((gethash cls-name *all-classes*))
(t (error "~a is an undefined class" cls-name))))
generated through LaTeX2HTML. M.Inaba 平成18年5月6日