From: Christophe R. <cs...@ca...> - 2006-05-08 17:06:44
|
"Levente M=E9sz=E1ros" <lev...@gm...> writes: > Is it allowed at all? I did not find anything saying the opposite in > the MOP spec. > > Ok, I'm not sure that this is a bug, but the behavior is quite > strange I think. I don't know if I'm being terribly conservative here, but I think the original MOP authors would probably not want to allow dispatch on new-value in (setf slot-value-using-class). The basic reason for my feeling is an argument from symmetry. The four slot-valueish functions are meant to be implemented or extended in synchronization, and bad things happen if they're not; so if you extend (setf slot-value-using-class) for your custom slot-definition, but not slot-value-using-class, various other bits of CLOS will stop working. My view of those four functions is that they are the lowest level above structures, and describe how to implement accessing instances, rather than as places to hang application hooks onto (which is what I slightly presume your (setf slot-value-using-class) customization is intended for. I think that if you want custom behaviour for a setter when given values of different classes, you probably ought to be specializing the setter function (e.g. an accessor) rather than slot-value-using-class directly. (Having said all that, your code (sa.lisp) falls foul of one of the restrictions in AMOP, which is that all methods on a custom metaclass (i.e. a subclass of the various standardized metaclasses, such as slot-definition or class) must be defined before an instance of those metaclasses is created. In your case, you create instances of sa-effective-slot-definition (by instantiating a finalizeable sa-class, topic, with a slot) before defining the (setf slot-value-using-class) methods specialized on it. Unfortunately, this is not the only issue in the case under consideration; PCL's GET-ACCESSOR-METHOD-FUNCTION simply does not allow for specialization on new-value. I could probably fix it to, or else disable it when there are specializations on new-value, but I'm really not sure I want to...) Cheers, Christophe |