From: Gabor M. <me...@ho...> - 2004-11-24 16:26:44
|
Suppose I have a class with a slot and a function. (defclass xxx () ((slut :reader xxx-slut))) (defun xxx-slot (xxx) 1) Then I realize the typo and try to change the class def to this: (defclass xxx () ((slot :reader xxx-slot))) There is an error which is fine, although a continue restart would be nice: XXX-SLOT already names an ordinary function or a macro. =46rom this point on, all redefinition attempts of xxx fail (including the= =20 original one) with the same error until fmakunbounding xxx-slot. Tested wit= h=20 sbcl 8.15.7 and 8.16.45. It seemed that the problem lies with a fix-slot-accessors trying to remove = a=20 method from the non-generic function xxx-slot and being vocal about its=20 failure. I fixed it temporarily like this and probably broke clos too, but = it=20 at least fixes the above behaviour :-): Index: std-class.lisp =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /cvsroot/sbcl/sbcl/src/pcl/std-class.lisp,v retrieving revision 1.70 diff -u -r1.70 std-class.lisp =2D-- std-class.lisp 19 Nov 2004 16:29:06 -0000 1.70 +++ std-class.lisp 24 Nov 2004 16:18:54 -0000 @@ -745,19 +745,23 @@ (defun fix-slot-accessors (class dslotds add/remove) (flet ((fix (gfspec name r/w) (let ((gf (if (fboundp gfspec) =2D (without-package-locks =2D (ensure-generic-function gfspec)) + (unless (and (eq add/remove 'remove) + (not (generic-function-p + (fdefinition gfspec)))) + (without-package-locks + (ensure-generic-function gfspec))) (ensure-generic-function gfspec :lambda-list (case r/w (r '(object)) (w '(new-value object)))))= )) =2D (case r/w =2D (r (if (eq add/remove 'add) =2D (add-reader-method class gf name) =2D (remove-reader-method class gf))) =2D (w (if (eq add/remove 'add) =2D (add-writer-method class gf name) =2D (remove-writer-method class gf))))))) + (when gf + (case r/w + (r (if (eq add/remove 'add) + (add-reader-method class gf name) + (remove-reader-method class gf))) + (w (if (eq add/remove 'add) + (add-writer-method class gf name) + (remove-writer-method class gf)))))))) (dolist (dslotd dslotds) (let ((slot-name (slot-definition-name dslotd))) (dolist (r (slot-definition-readers dslotd)) G=E1bor |
From: Christophe R. <cs...@ca...> - 2004-11-24 17:28:27
|
Gabor Melis <me...@ho...> writes: > From this point on, all redefinition attempts of xxx fail (including > the original one) with the same error until fmakunbounding > xxx-slot. Tested with sbcl 8.15.7 and 8.16.45. I don't know -- why do you think this is a problem? It seems reasonable to me. (Arguably we could be slightly friendlier in offering one or two more restarts, but I don't see that automatically clobbering a perfectly valid ordinary function with an accessor method is a good idea.) Cheers, Christophe |
From: Gabor M. <me...@ho...> - 2004-11-25 07:37:01
|
On Wednesday 24 November 2004 18:28, Christophe Rhodes wrote: > Gabor Melis <me...@ho...> writes: > > From this point on, all redefinition attempts of xxx fail (including > > the original one) with the same error until fmakunbounding > > xxx-slot. Tested with sbcl 8.15.7 and 8.16.45. > > I don't know -- why do you think this is a problem? It seems > reasonable to me. (Arguably we could be slightly friendlier in > offering one or two more restarts, but I don't see that automatically > clobbering a perfectly valid ordinary function with an accessor method > is a good idea.) > Yes, a continue restart would be nice, but the point was that evaluating a defclass with no slot named "slot" can produce such on error. Maybe I'll write the example in evaluation order and not how-i-bumped-into-this order: (defclass xxx () ((slot :reader xxx-slot))) (defun xxx-slot (xxx) 1) ;; this will produce an error, because it cannot remove ;; the method for slot "slot" (defclass xxx () ()) > Cheers, > > Christophe |
From: Nikodemus S. <tsi...@cc...> - 2004-11-25 15:29:15
|
On Thu, 25 Nov 2004, Gabor Melis wrote: > (defclass xxx () > ((slot :reader xxx-slot))) > > (defun xxx-slot (xxx) > 1) > > ;; this will produce an error, because it cannot remove > ;; the method for slot "slot" > (defclass xxx () > ()) Say hello to bug #336 from the BUGS file; what you're seeing is not desirable, but it is a known issue, waiting to be fixed without an ETA. Cheers, -- Nikodemus Schemer: "Buddha is small, clean, and serious." Lispnik: "Buddha is big, has hairy armpits, and laughs." |