[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