[cells-devel] Re: [cello-devel] Constructor syntax
Thomas F. Burdick
tfb at OCF.Berkeley.EDU
Fri May 14 06:23:20 UTC 2004
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.
More information about the cello-devel
mailing list