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

Pascal Costanza pc at p-cos.net
Sun Oct 19 13:46:37 PDT 2008


On 19 Oct 2008, at 22:40, Bob Hutchison wrote:

> Hi Pascal,
>
> Thanks. Comments and questions below...
>
> 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.
>
> Better ideas?

Stop using make-instance is not a bad idea. You could define your own  
create-instance function (or so), or shadow cl:make-instance in your  
own package to replace it with your own version. If the caching  
functionality is the only functionality you want to add, the CLOS MOP  
may be too big a weapon for this purpose.

Are you sure that you need such caching? Garbage collectors are  
nowadays pretty good at recycling short-lived objects, so that you  
shouldn't need this for performance purposes - unless this is about  
semantics and not performance...


Pascal

-- 
Lisp50: http://www.lisp50.org

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