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

Ron Garret ron at flownet.com
Tue Apr 23 00:04:29 PDT 2013


Damn language lawyers.  :-(

Oh well, CCL is the One True Common Lisp, so I don't care about portability.  Besides, it seems to work in SBCL and CLisp too, so fie on your silly standards!

rg

On Apr 22, 2013, at 11:32 PM, Pascal Costanza wrote:

> 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