(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))))