* Raymond Toy [2010-03-15 15:01+0100] writes:
On 3/12/10 11:45 AM, Helmut Eller wrote:
* Raymond Toy [2010-03-12 12:35+0100] writes:
So COMPILE has silently zapped the structure. We should probably print he warning for this too.
Yes, definitely. Also for this:
(defstruct xyz a) (setf (fdefinition 'xyz-a) (lambda () 42))
I added a hook to *setf-fdefinition-hook* to check for this case. Works ok, but now I can't compile clx/depdefs.lisp. CMUCL complains about redefining reply-size and buffer-lock which are slot accessor functions. But I haven't figured out from the code where the redefinition is coming from.
Also, consider this:
(defstruct abc a b c) (defun abc-a () 42)
CMUCL undefines the structure, but
CMUCL undefines the structure? That seems a bit aggressive. I think it should only delete the (c:info function info 'abc-a) entry if that's not done yet. The compiler uses that to recognize "known" functions. I don't know if (setf abc-a) still works if the info entry for abc-a is cleared.
(defstruct abc a)
produces an error about incompatibly redefining the structure.
That seems totally OK to me.
Note that in both cases any existing structures will be in a bad state. They still exist, but there's not much you can do with them.
Compiled could would continue to work since accessors are inlined. Also (type-of (make-xyz)) still works. The printer is effed up, though.
If we undefined the structure, I would expect make-xyz (or make-abc) not to work.
What to do?
I wouldn't undefine the entire structure; only redefine the named accessor function. For the printer we could come up with something like SLOT-VALUE but it should work without PCL. Helmut