[Openmcl-devel] [off-topic] Adding a slot to a class using the MOP

Pascal Costanza pc at p-cos.net
Mon Apr 22 23:32:49 PDT 2013


You're invoking undefined behavior here, because your method on ensure-class-using-class doesn't specialize on any of your own metaclasses. See bullet one in "Restrictions on Portable Programs" in the CLOS MOP specification.

Pascal 

On 23 Apr 2013, at 08:29, Ron Garret <ron at flownet.com> wrote:

> Why not this?
> 
> (defmethod ensure-class-using-class :before (class name &rest args)
>  (setf (get 'class-info name) (list* class args)))
> 
> (defun add-slot (class-name slotspec)
>  (destructuring-bind (class . args) (get 'class-info class-name)
>    (push slotspec (getf args :direct-slots args))
>    (apply 'ensure-class-using-class class class-name args)))
> 
> It seems to work:
> 
> ? (defclass foo () (x y z))
> #<STANDARD-CLASS FOO>
> ? (add-slot 'foo '(:name q))
> #<STANDARD-CLASS FOO>
> ? (describe (make-instance 'foo))
> #<FOO #x3020028B7DAD>
> Class: #<STANDARD-CLASS FOO>
> Wrapper: #<CCL::CLASS-WRAPPER FOO #x3020028B9EBD>
> Instance slots
> Q: #<Unbound>
> X: #<Unbound>
> Y: #<Unbound>
> Z: #<Unbound>
> 
> On Apr 22, 2013, at 1:23 PM, Pascal Costanza wrote:
> 
>> Check out AspectL, it provides exactly what you want.
>> 
>> However, it's also worthwhile spending some time on thinking about whether there is a better design for your problem. Adding slots like this creates a lot of problems. Maybe a typical hash table based meta class already provides what you need...
>> 
>> Pascal
>> 
>> Sent from my iPad
>> 
>> On 22 Apr 2013, at 19:32, Ron Garret <ron at flownet.com> wrote:
>> 
>>> Apologies for the non-CCL-related question, but c.l.l. is slow today and I'm really stuck on this.
>>> 
>>> I need to dynamically add a slot to a class using the MOP.  There doesn't seem to be a standard add-slot method, so I figure I need to use something like ensure-class.  To do that, I need to reconstruct the argument to :direct-slots from the existing class definition so I can add a slot without disturbing the existing slots.  Before I went down this rabbit hole I thought I'd ask: is there a better/easier way to do this?  Surely I'm not the first person to want to do this.
>>> 
>>> Many thanks,
>>> rg
>>> 
>>> _______________________________________________
>>> Openmcl-devel mailing list
>>> Openmcl-devel at clozure.com
>>> http://clozure.com/mailman/listinfo/openmcl-devel
> 

--
Pascal Costanza






More information about the Openmcl-devel mailing list