home *** CD-ROM | disk | FTP | other *** search
Text File | 1994-09-27 | 21.4 KB | 139 lines | [TEXT/CCL2] |
- ;;; cl-structs.lisp -- extended structure definitions
- ;;;
- ;;; author : Sandra Loosemore
- ;;; date : 19 Aug 1992
- ;;;
-
-
- ;;;====================================================================
- ;;; Basic structure types
- ;;;====================================================================
-
-
- ;;; Use this hash table for mapping names -> type descriptors
-
- (defvar *struct-lookup-table* (make-hash-table :test #'eq))
-
- (defmacro lookup-type (name)
- `(gethash ,name *struct-lookup-table*))
-
-
- ;;; Do NOT add or remove slots from these DEFSTRUCTS without also
- ;;; changing the bootstrap code below!!!
- ;;; Do NOT try to give these structs complicated defaulting behavior!!!
-
- ;;; All of our objects are subtypes of STRUCT.
-
-
- (mumble::predefine (mumble::write object . maybe-stream))
-
- (defun print-struct-object (object stream depth)
- (declare (ignore depth))
- (mumble::write object stream)
- ; (format stream "#<Struct ~a>" (td-name (struct-type-descriptor object)))
- )
-
-
- ;;; Note that non-exported slots are prefixed with % to prevent
- ;;; accidental slot name collisions.
-
- (defstruct (struct
- (:print-function print-struct-object)
- (:predicate struct?)
- (:constructor nil) ; never instantiated directly
- (:copier nil))
- (type-descriptor nil :type t)
- (%bits 0 :type fixnum)
- )
-
-
- (defstruct (type-descriptor
- (:include struct
- (type-descriptor (lookup-type 'type-descriptor)))
- (:conc-name td-)
- (:constructor create-type-descriptor ())
- (:predicate nil)
- (:copier nil))
- (name nil :type symbol)
- (slots nil :type list) ; all slots, including inherited
- (parent-type nil :type t)
- (printer nil :type t)
- (%local-slots nil :type list) ; "real" structure slots
- (%bits-used 0 :type fixnum)
- (%constructor nil :type symbol)
- )
-
- (defstruct (slot-descriptor
- (:include struct
- (type-descriptor (lookup-type 'slot-descriptor)))
- (:conc-name sd-)
- (:constructor create-slot-descriptor ())
- (:predicate nil)
- (:copier nil))
- (name nil :type symbol)
- (type nil :type t)
- (default nil :type t)
- (getter nil :type symbol)
- (%bit nil :type (mumble::maybe fixnum))
- (%read-only? nil :type mumble::bool)
- (%required? nil :type mumble::bool)
- (%uninitialized? nil :type mumble::bool))
-
-
- ;;; Helper function for bootstrapping.
-
- (defun create-slot-simple (prefix name type default
- &optional read-only? required? uninitialized?)
- (let ((sd (create-slot-descriptor)))
- (setf (sd-name sd) name)
- (setf (sd-type sd) type)
- (setf (sd-default sd) default)
- (setf (sd-getter sd) (symbol-append prefix name))
- (setf (sd-%read-only? sd) read-only?)
- (setf (sd-%required? sd) required?)
- (setf (sd-%uninitialized? sd) uninitialized?)
- sd))
-
-
- ;;; Initialize descriptors for the predefined struct types.
-
- (let ((struct-td (setf (lookup-type 'struct)
- (create-type-descriptor)))
- (type-td (setf (lookup-type 'type-descriptor)
- (create-type-descriptor)))
- (slot-td (setf (lookup-type 'slot-descriptor)
- (create-type-descriptor))))
- ;; struct
- (setf (td-type-descriptor struct-td) type-td)
- (setf (td-name struct-td) 'struct)
- (setf (td-%bits-used struct-td) 0)
- ;; type-descriptor
- (setf (td-type-descriptor type-td) type-td)
- (setf (td-name type-td) 'type-descriptor)
- (setf (td-%local-slots type-td)
- (list (create-slot-simple 'td- 'name 'symbol nil)
- (create-slot-simple 'td- 'slots 'list nil)
- (create-slot-simple 'td- 'parent-type 't nil)
- (create-slot-simple 'td- 'printer 't nil)
- (create-slot-simple 'td- '%local-slots 'list nil)
- (create-slot-simple 'td- '%bits-used 'fixnum 0)
- (create-slot-simple 'td- '%constructor 'symbol nil)
- ))
- (setf (td-slots type-td) (td-%local-slots type-td))
- (setf (td-%bits-used type-td) 0)
- (setf (td-%constructor type-td) 'create-type-descriptor)
- (setf (td-parent-type type-td) struct-td)
- ;; slot-descriptor
- (setf (td-type-descriptor slot-td) type-td)
- (setf (td-name slot-td) 'slot-descriptor)
- (setf (td-%local-slots slot-td)
- (list (create-slot-simple 'sd- 'name 'symbol nil)
- (create-slot-simple 'sd- 'type 't nil)
- (create-slot-simple 'sd- 'default 't nil)
- (create-slot-simple 'sd- 'getter 'symbol nil)
- (create-slot-simple 'sd- '%bit '(mumble::maybe fixnum) nil)
- (create-slot-simple 'sd- '%read-only? 'mumble::bool nil)
- (create-slot-simple 'sd- '%required? 'mumble::bool nil)
- (create-slot-simple 'sd- '%uninitialized? 'mumble::bool nil)
- ))
- (setf (td-slots slot-td) (td-%local-slots slot-td)