Kenny Tilton writes:
Thomas F. Burdick wrote:
So ... uh, which approach do you think is worse: using a c-slot-makunbound function that works for both normal and cell-mediated slots;
In this contrast between normal and cell-mediated, does normal mean a slot specified:
:cell nil
I still need to work on my Cells-related terminology; I mean this case. That way Cells-using programs could use the same makunbound for all objects, without worrying about where they came from.
[aside: is it c-slot-makunbound or md-slot-makunbound? I have both in re slot-value. md- takes the slot name, looks for a cell, calls c- if it finds one. By that parallel we are talkin bout md-slot-value]
Yeah, I guess it would be md-slot-makunbound, considering you get to the slot with md-slot-value.
or including hacks to make MCL and CLISP go through slot-makunbound-using-class?
Hunh? MCL does not /have/ a slot-makunbound-using-class (he guessed based on MCL not exposing much of the MOP). How can you make MCL go thru what it does not have? ie, if (i am guessing) slot-makunbound is a function, how do you change its behavior? advise (which is one corner of Lisp I have never visited)?
Golly I wish the MOP were part of the standard.
(No kidding). Well, MCL doesn't /ship/ with s-m-u-c ... but it does have enough of a MOP to write one. Then, once such a beast is written, slot-makunbound can be redefined to go through it. In fact, I have such a beast from my previous MCL adventures. Those with sensitive constitutions may want to skip this:
(defpackage :s-m-u-c-patch (:use :common-lisp :ccl))
(in-package :s-m-u-c-patch)
(unless (fboundp 'ccl::slot-makunbound-using-class)
(unless (fboundp '%slot-makunbound) (setf (symbol-function '%slot-makunbound) (symbol-function 'slot-makunbound)))
(defgeneric ccl::slot-makunbound-using-class (class object slotd) (:method ((class standard-class) object (slotd cons)) (%slot-makunbound object (slot-definition-name slotd))))
(handler-bind ((error (lambda (e) (let ((do-it (find-restart 'continue e))) (when do-it (invoke-restart do-it))))))
(defun slot-makunbound (object slot) (let* ((class (class-of object)) (slotd (or (find slot (class-instance-slots class) :key #'slot-definition-name) (slot-missing class object slot 'slot-makunbound)))) (ccl::slot-makunbound-using-class class object slotd))))
(export '(ccl::slot-makunbound-using-class) :ccl))
But, uhm, it does work. It's evil in a good way?
Personally, I'd go with slot-makunbound-using-class, and hack it into systems missing it (obviously, since I load the above code in my MCL init file). But if you find that to be in bad taste, I could do the md-slot-makunbound route. *I* think I have great taste, but not everyone always agrees; some people prefer to fake the funk.