[Openmcl-devel] CLOS make-instance :around behaviour

Pascal Costanza pc at p-cos.net
Sat Oct 25 09:05:43 PDT 2008


On 20 Oct 2008, at 16:21, Bob Hutchison wrote:

>
> On 19-Oct-08, at 4:40 PM, Bob Hutchison wrote:
>
>>
>> On 19-Oct-08, at 3:33 PM, Pascal Costanza wrote:
>>
>>> You're invoking undefined consequences.
>>>
>>> See Section 11.1.2.1.2 in the HyperSpec, bullet 19: You're  
>>> defining a method on a predefined generic function (make-instance)  
>>> which is applicable when its only required argument is a direct  
>>> instance of a standardized class (here the class 'symbol, of which  
>>> 'some-class is an instance: (typep 'some-class 'symbol) => T).
>>
>> Never would have found that :-) Thanks.
>>
>>>
>>>
>>> Common Lisp implementations are allowed to take that restriction  
>>> into account and, for example, compile away the call to make- 
>>> instance and replace it with something more efficient in case the  
>>> first argument is a constant symbol (for example).
>>>
>>> If you really need :around methods on make-instance, consider  
>>> defining your own metaclass using the CLOS MOP. But based on your  
>>> example, I have the impression that an :after method on initialize- 
>>> instance should be sufficient, which is generally preferable  
>>> anyway...
>>
>> That example is simplified. What I'm trying to do is implement a  
>> cache like thing. If someone calls, say, (make-instance 'thing :id  
>> "abc") then if there is already a thing with id "abc" return it  
>> rather than a new instance.
>>
>> As far as I know there's no way to change the return value of the  
>> primary method just using an :after method.
>>
>> So... I suppose either I define my own metaclass (a new adventure  
>> for me :-) or stop using make-instance.
>
> I wound up defining my own metaclass. Jan Marecek gave me a nice  
> head start, and Closer to Mop makes it portable (thanks again Pascal).
>
> This worked out quite nicely, with the exception that eql  
> specializers on methods don't work anymore. They aren't actually  
> needed with the new metaclass, so I didn't spend a lot of time  
> trying to workout how to get them working.


This is weird, why should eql specializers not work anymore?


Pascal

-- 
Pascal Costanza, mailto:pc at p-cos.net, http://p-cos.net
Vrije Universiteit Brussel, Programming Technology Lab
Pleinlaan 2, B-1050 Brussel, Belgium











More information about the Openmcl-devel mailing list