home *** CD-ROM | disk | FTP | other *** search
- Path: sparky!uunet!europa.asd.contel.com!darwin.sura.net!mips!apple!apple!cambridge.apple.com!bill@cambridge.apple.com
- From: bill@cambridge.apple.com (Bill St. Clair)
- Newsgroups: comp.lang.lisp.mcl
- Subject: Re: Getting slot accessors for defclass reconstruction
- Message-ID: <9207221435.AA14957@cambridge.apple.com>
- Date: 22 Jul 92 16:19:46 GMT
- Sender: info-mcl-request@cambridge.apple.com
- Lines: 77
- Approved: comp.lang.lisp.mcl@Cambridge.Apple.C0M
- Full-Name: Bill St. Clair
- Original-To: cornell@freya.cs.umass.edu
- Original-Cc: info-mcl
-
- I forgot to require "LISPEQU" to get the definitions for %SLOTD-TYPE,
- %SLOTD-INITFORM, and %SLOTD-INITARGS. The code should be:
-
- --------------------------------------------------------------------
-
- ; slot-definition-accessors.lisp
- ;
- ; More of the AMOP slot definition accessors for MCL 2.0
-
- (in-package :ccl)
-
- (export '(slot-definition-initargs slot-definition-initform
- slot-definition-initfunction slot-definition-type
- slot-readers slot-writers
- accessor-method-slot-definition))
-
- (eval-when (:compile-toplevel :execute)
- (require "LISPEQU"))
-
- (defun maybe-slot-definition-p (thing)
- (let ((sd thing))
- (and (consp sd)
- (consp (setq sd (cdr (the cons sd))))
- (consp (cdr (the cons sd))))))
-
- (defun ensure-slotd (thing)
- (if (maybe-slot-definition-p thing)
- thing
- (require-type thing '(satisfies maybe-slot-definition-p))))
-
- (defmethod slot-definition-initargs ((slotd list))
- (%slotd-initargs (ensure-slotd slotd)))
-
- (defmethod slot-definition-initform ((slotd list))
- (let ((fun-or-form-list (%slotd-initform (ensure-slotd slotd))))
- (if (listp fun-or-form-list)
- (car fun-or-form-list)
- `(funcall ,fun-or-form-list))))
-
- (defmethod slot-definition-initfunction ((slotd list))
- (let ((fun-or-form-list (%slotd-initform (ensure-slotd slotd))))
- (cond ((null fun-or-form-list) nil)
- ((listp fun-or-form-list)
- (let ((value (car fun-or-form-list)))
- #'(lambda () value)))
- (t fun-or-form-list))))
-
- (defmethod slot-definition-type ((slotd list))
- (or (%slotd-type (ensure-slotd slotd)) t))
-
- ; The AMOP defines functions called SLOT-DEFINITION-READERS
- ; and SLOT-DEFINITION-WRITERS, which take a slot definition
- ; object as their single argument. MCL does not store the
- ; class in a slot definition object, so it can't work that way.
- (defun slot-readers (class slot-name)
- (let ((res nil))
- (dolist (accessor (%class-get class 'accessor-methods))
- (if (and (eq slot-name (method-slot-name accessor))
- (typep accessor 'standard-reader-method))
- (push (method-name accessor) res)))
- res))
-
- (defun slot-writers (class slot-name)
- (let ((res nil))
- (dolist (accessor (%class-get class 'accessor-methods))
- (if (and (eq slot-name (method-slot-name accessor))
- (typep accessor 'standard-writer-method))
- (push (method-name accessor) res)))
- res))
-
- (defmethod accessor-method-slot-definition ((method standard-accessor-method))
- (let* ((name (method-slot-name method))
- (class (car (method-specializers method))))
- (or (assq name (class-direct-instance-slots class))
- (assq name (class-direct-class-slots class))
- (error "Can't find slot definition for slot named ~s of ~s"
- name class))))
-