[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Status of the PCL's metaclass implementation
- To: shane%blackcomb@RAND-UNIX.ARPA
- Subject: Re: Status of the PCL's metaclass implementation
- From: kanderso@PEBBLES.BBN.COM
- Date: Tue, 08 Nov 88 10:18:57 -0500
- Cc: commonloops.pa@Xerox.COM
- In-reply-to: Your message of Mon, 07 Nov 88 19:19:53 -0800. <8811080319.AA07297@blackcomb.arpa>
- Redistributed: commonloops.pa
To: commonloops.pa@xerox.com
Subject: Status of the PCL's metaclass implementation
Date: Mon, 07 Nov 88 19:19:53 PST
From: shane%blackcomb@rand.org
1] Could someone give me a clear distinction between a
superclass and a metaclass. When would one want to use a
metaclass; and what baggage is required by metaclasses.
;;; --------------------
;;; I defined a metaclass as follows:
;;; --------------------
<fcl 38> (defclass my-standard-class1 ()
((my-slot :accessor my-slot))
(:metaclass standard-class))
NIL
<fcl 39> (setq mcs1 (find-class 'my-standard-class1))
#<Standard-Class MY-STANDARD-CLASS1 17447731>
<fcl 40> (describe mcs1)
The class #<Standard-Class MY-STANDARD-CLASS1 17447731> is an instance of
class #<Standard-Class STANDARD-CLASS 13024421>.
Name: MY-STANDARD-CLASS1
Class-Precedence-List: (MY-STANDARD-CLASS1 OBJECT T)
Local-Supers: (OBJECT)
Direct-Subclasses: NIL
#<Standard-Class MY-STANDARD-CLASS1 17447731>
;;; --------------------
;;; Then I tried to define another class such that my-slot is one of
;;; the class' slots:
;;; --------------------
<fcl 41> (defclass my-class1 () ()
(:metaclass my-standard-class1))
Error: No matching method for the generic-function #<Function
EXPAND-DEFCLASS @ #x2b4599>,
when called with arguments (#<MY-STANDARD-CLASS1 17473401> MY-CLASS1 NIL
NIL NIL).
The metaobject protocol is asking my-standard-class1 to handle
expand-defclass which it doesn't handle. Your example below is built
on standard-class which does handle it, so expand-defclass then works.
;;; --------------------
;;; Then I defined another class:
;;; --------------------
<fcl 44> (defclass my-standard-class2 (standard-class)
((my-slot :accessor my-slot)))
This stands a chance of being a metaclass, but see below ...
;;; --------------------
;;; And again I tried to define another class such that my-slot is one of
;;; the class' slots:
;;; --------------------
<fcl 47> (defclass my-class2 () ()
(:metaclass my-standard-class2))
Error: The class #<Standard-Class OBJECT 13024201> was specified as a
super-class of the class #<My-Standard-Class2 MY-CLASS2 17563731>;
but the meta-classes #<Standard-Class STANDARD-CLASS 13024421> and
#<Standard-Class MY-STANDARD-CLASS2 17503031> are incompatible.
[1] <fcl 48> :zoom
Evaluation stack:
Your class my-class2 is built on OBJECT which is has metaclass
standard-nclass. PCL checks to see if it is ok to mix classes from 2
different metaclasses using check-super-metaclass-compatibility your
metaclass must provide a non nil response if this is OK. This should
be better documented.
Since you want this most of the time, i use the following metaclass
mixin.
(defclass compatible-class-mixin
()
())
(defmethod check-super-metaclass-compatibility
((class compatible-class-mixin) (super standard-class))
t)
;;; --------------------
Obviously, neither one of these attempts worked. Essentially what I
want is to be able to access the my-slot slot by:
(setf (my-slot mc1) 'hello) => HELLO
(my-slot mc1) => HELLO
Your approach is correct. Try it again after adding the mixin.
2] When describing an instance, containing an unbound slot, is an
error the proper response? For instance,
(defclass c1 () ((a)))
(describe (make-instance 'c1)) =>
#<C1 xxxxxxxx> is an instance of class #<Standard-Class C1 yyyyyyyy>:
The following slots have :INSTANCE allocation:Error: The slot A is
unbound in the object #<C1 xxxxxxxx>.
I believe patches for this have come over the list.
Thank you,
Darrell Shane
P.S> I am running 8/28/88 (beta rev 1) AAAI PCL under Franz Allegro
CL 3.0.1 [sun3].