next up previous
Next: 15.2 クラス定義の実現 Up: 15 CLOSのクラスシステムの実現 Previous: 15 CLOSのクラスシステムの実現

15.1 クラスの実現

クラスを表現するために構造体を用います. 構造体の要素にはクラスを表現するために必要なデータを蓄えるための ものを用意しておきます. ここでは,クラスの名前(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日