[rjain-utils-cvs] CVS prototypes
rjain
rjain at common-lisp.net
Wed Nov 25 10:46:36 UTC 2009
Update of /project/rjain-utils/cvsroot/prototypes
In directory cl-net:/tmp/cvs-serv4504
Modified Files:
prototypes.lisp
Log Message:
use CLOSER-MOP
allow slot-unbound errors to propagate out of slot-value accessors
add test case for above change
--- /project/rjain-utils/cvsroot/prototypes/prototypes.lisp 2009/11/24 10:43:30 1.5
+++ /project/rjain-utils/cvsroot/prototypes/prototypes.lisp 2009/11/25 10:46:36 1.6
@@ -4,7 +4,7 @@
#:prototype-add-delegate
#:prototype-remove-delegate
#:make-prototype)
- (:use :cl #+sbcl :sb-mop #-sbcl :mop))
+ (:use :cl :closer-mop))
(in-package :prototypes)
@@ -104,14 +104,20 @@
&optional new-value)
(declare (ignore new-value))
(dolist (delegate (prototype-delegates object)
+ ;; if no slot is found in all the delegates, we
+ ;; call the default method to signal a
+ ;; slot-missing error
(call-next-method))
- (ignore-errors
- ;; if OPERATION succeeds on the delegate, RETURN
- ;; that result from our loop, otherwise it will
- ;; error and continue on to the next delegate, via
- ;; IGNORE-ERRORS. If no delegates are left, it will
- ;; call the default method which signals a
- ;; slot-missing error.
+ (handler-bind ((unbound-slot #'error)
+ ;; there is no specific class for
+ ;; slot-missing errors. the spec just
+ ;; says signals an error of type error.
+ ;; ugh.
+ (error
+ ;; can't find the slot here, so we
+ ;; continue to the next delegate
+ #'identity))
+ ;; if this finds the slot, we return it
(return (,operation delegate slot-name)))))))
(reader-delegation slot-value)
(reader-delegation slot-boundp))
@@ -217,6 +223,11 @@
(assert (eql (slot-value *3* 'x) 3))
(assert (not (slot-boundp *3.1* 'x)))
(assert (not (slot-boundp *3.3.1* 'x)))
+(handler-case
+ (progn
+ (slot-value *3.3.1* 'x)
+ (assert nil))
+ (unbound-slot (error)))
(defclass test ()
((x :allocation :class)))
More information about the Rjain-utils-cvs
mailing list