[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Bug in walking setq of slot
- To: Commonloops.pa@Xerox.COM
- Subject: Bug in walking setq of slot
- From: Michael Travers <mt@MEDIA-LAB.MEDIA.MIT.EDU>
- Date: Tue, 16 Feb 88 16:58 EST
- Redistributed: Commonloops.pa
Our most recent version of PCL (which I guess is the Valentine's day
version--it was snarfed on the 15th) has a rather bad bug that causes
setq of a slot-variable to fail to compile properly. Ie:
(defclass thing ()
(x y))
(defmethod gazork ((a thing) b)
(with-slots* (x) a
(setq x b)))
The gazork method will get compile errors.
The following patch seems to fix things in the Symbolics version.
; from PCL:PCL;STD-CLASS
pcl::
(defun with-slots-internal (specs form context translate-fn &aux entry)
(cond ((not (eq context :eval)) form)
((symbolp form)
(if (setq entry (assoc form specs))
(funcall translate-fn (cadr entry))
form))
((not (listp form)) form)
((member (car form) '(setq setf))
;; Have to be careful. We must only convert the form to a SETF
;; form when we convert one of the 'logical' variables to a form
;; Otherwise we will get looping in implementations where setf
;; is a macro which expands into setq.
(let ((kind (car form)))
(labels ((scan-setf (tail)
(if (null tail)
nil
(walker::relist*
tail
(if (setq entry (assoc (car tail) specs))
(progn (setq kind 'setf)
(funcall translate-fn (cadr entry)))
(car tail))
(cadr tail)
(scan-setf (cddr tail))))))
(let ((set-args (scan-setf (cdr form))))
(walker::recons form kind set-args)))))
(t form)))