From: Christian Lynbech
Subject: MOP/pcl anomaly in CMUCL?
Date: 
Message-ID: <ofiu294qgr.fsf@chl.tbit.dk>
In an attempt to backport some code from scheme (guile/goops) I tried
to make a simple test, taken from AMOP (the dynamic slots example).

I was trying to do the following:

    (defclass dynamic-slots-class (standard-class) ())
    (defclass test () ((a1)) (:metaclass dynamic-slots-class))

My expectation was that since I have not specialized any MOP
functions, the above should work as normal.

However I got the error:

    Error in function PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (STD-CLASS T))|:
       The class #<Standard-Class STANDARD-OBJECT {281553C5}> was specified as a

			 super-class of the class #<Dynamic-Slots-Class TEST {480CD265}>;
    but the meta-classes #<Standard-Class PCL::STANDARD-CLASS {2815500D}> and
    #<Standard-Class DYNAMIC-SLOTS-CLASS {481028A5}> are incompatible.
    Define a method for PCL:VALIDATE-SUPERCLASS to avoid this error.

Can anybody explain to me what is worng here and how to correct it? Is
there any documentation on the PCL MOP that I should read?

(I can also add that it works as I had originally expected in ACL5.)

Complete transcript of the session below.


* (defclass dynamic-slots-class (standard-class) ())
Compiling LAMBDA (#:G859 #:G861 #:G862): 
Compiling Top-Level Form: 
Compiling LAMBDA (#:G864 #:G876 #:G877): 
Compiling Top-Level Form: 

[GC threshold exceeded with 2,001,128 bytes in use.  Commencing GC.]
[GC completed with 767,168 bytes retained and 1,233,960 bytes freed.]
[GC will next occur when at least 2,767,168 bytes are in use.]
Compiling LAMBDA (#:G889 #:G891 #:G892): 
Compiling Top-Level Form: 
Compiling LAMBDA (#:G894 #:G896 #:G897): 
Compiling Top-Level Form: 
Compiling LAMBDA (#:G899 #:G901 #:G902): 
Compiling Top-Level Form: 
#<STANDARD-CLASS DYNAMIC-SLOTS-CLASS {481F048D}>
* (defclass test () ((a1)) (:metaclass dynamic-slots-class))


Error in function PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (STD-CLASS T))|:
   The class #<Standard-Class STANDARD-OBJECT {281553C5}> was specified as a

		     super-class of the class #<Dynamic-Slots-Class TEST {480CD265}>;
but the meta-classes #<Standard-Class PCL::STANDARD-CLASS {2815500D}> and
#<Standard-Class DYNAMIC-SLOTS-CLASS {481028A5}> are incompatible.
Define a method for PCL:VALIDATE-SUPERCLASS to avoid this error.

Restarts:
  0: [ABORT] Return to Top-Level.

Debug  (type H for help)

(PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (STD-CLASS T))|
 (#(NIL 14 5 8) . #())
 #<unavailable-arg>
 #<Dynamic-Slots-Class TEST {480CD265}>
 #<unavailable-arg>
 ...)
0] 



---------------------------+--------------------------------------------------
Christian Lynbech          | Ericsson Telebit A/S                       
Fax:   +45 8628 8186       | Fabrikvej 11, DK-8260 Viby J
Phone: +45 8628 8177 + 28  | email: ···@tbit.dk --- URL: http://www.tbit.dk
---------------------------+--------------------------------------------------
Hit the philistines three times over the head with the Elisp reference manual.
                                        - ·······@hal.com (Michael A. Petonic)
From: Pierre R. Mai
Subject: Re: MOP/pcl anomaly in CMUCL?
Date: 
Message-ID: <87ln759o9t.fsf@orion.dent.isdn.cs.tu-berlin.de>
Christian Lynbech <···@tbit.dk> writes:

> In an attempt to backport some code from scheme (guile/goops) I tried
> to make a simple test, taken from AMOP (the dynamic slots example).

When using the MOP of CMUCL/PCL you have to take into account a number 
of issues (in other implementations, you have to take into account
other sets of issues, which makes portable MOP programming less
enjoyable than it could be.  I hope that current and future efforts of 
the standardization committees will improve that situation ;):

* Make sure that you use the right symbols:  A number of symbols (like 
  e.g. standard-class) exist in two variants, one in the COMMON-LISP
  package, and one in the PCL package.  For MOP programming you
  usually need the ones in PCL.

* Take a look at the MOP package, which exports most (but not all) of
  the symbols defined in AMOP.

* Since CMUCL uses special wrappers around class-objects, you
  sometimes need to use pcl::coerce-to-pcl-class to coerce those
  wrappers into the real PCL/MOP class objects (e.g. when using
  class-of).

* It's neccessary to define methods on pcl:validate-superclass more
  often than is mentioned in AMOP.

The last issue will probably lie at the heart of your problem:  Since
test (whose metaclass is dynamic-slots-class) inherits from t (whose
metaclass is standard-class), you have to define this combination
valid:

(defmethod pcl:validate-superclass
    ((class dynamic-slots-class) (super pcl:standard-class))
  t)

> I was trying to do the following:
> 
>     (defclass dynamic-slots-class (standard-class) ())
>     (defclass test () ((a1)) (:metaclass dynamic-slots-class))

Regs, Pierre.

-- 
Pierre Mai <····@acm.org>         PGP and GPG keys at your nearest Keyserver
  "One smaller motivation which, in part, stems from altruism is Microsoft-
   bashing." [Microsoft memo, see http://www.opensource.org/halloween1.html]