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

Pascal Costanza pc at p-cos.net
Tue Apr 23 00:24:09 PDT 2013


The rule is not only there to say that something is undefined (har! har! now deal with this, suckers! ;).

The rule is there so that different libraries don't interfere with each other. If you specialize at least one argument on one of "your own" classes or objects, then your method is less likely to interfere with other methods from other libraries. If you don't specialize, and other libraries also don't specialize, then you may end up just overriding each other's methods, which is not good.

Pascal

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

> 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
>> 
>> 
>> 
> 

--
Pascal Costanza






More information about the Openmcl-devel mailing list