;;; it under the terms of the GNU General Public License as published by
;;; the Free Software Foundation; either version 2 of the License, or
;;; (at your option) any later version.
-;;;
+;;;
;;; This program is distributed in the hope that it will be useful,
;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;;; GNU General Public License for more details.
-;;;
+;;;
;;; You should have received a copy of the GNU General Public License
;;; along with this program; if not, write to the Free Software Foundation,
;;; Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
;;; Packages.
(defpackage #:mdw.mop
- (:use #:common-lisp #:mdw.base #+(or cmu clisp) #:mop #+ecl #:clos)
+ (:use #:common-lisp #:mdw.base
+ #+(or cmu clisp) #:mop
+ #+sbcl #:sb-mop
+ #+ecl #:clos)
(:export #:copy-instance #:copy-instance-using-class
#:with-slot-variables
#:compatible-class
(listify slots)
(mapcar #'slot-definition-name
(class-slots class))))))
- (multiple-value-bind
- (docs decls body)
- (parse-body body :allow-docstring-p nil)
- (declare (ignore docs))
+ (with-parsed-body (body decls) body
(with-gensyms (instvar)
`(let ((,instvar ,instance))
,@(and class `((declare (type ,(class-name class) ,instvar))))
(Yes, I know that using functions would be nicer, but the MOP makes
that surprisingly difficult.)"))
+(defgeneric slot-definition-filter (slot)
+ (:method ((slot slot-definition)) nil))
+
(defclass filtered-direct-slot-definition
(standard-direct-slot-definition)
((filter :initarg :filter :reader slot-definition-filter)))
-(defgeneric slot-definition-filter (slot)
- (:method ((slot slot-definition)) nil))
-
(defclass filtered-effective-slot-definition
(standard-effective-slot-definition)
((filter :initarg :filter :accessor slot-definition-filter)))
(defun print-object-with-slots (obj stream)
"Prints objects in a pleasant way. Not too clever about circularity."
(let ((class (class-of obj))
- (magic (cons 'magic nil)))
+ (magic (cons 'magic nil)))
(print-unreadable-object (obj stream)
(pprint-logical-block
- (stream
- (mapcan (lambda (slot)
- (list (or (car (slot-definition-initargs slot))
- (slot-definition-name slot))
- (if (slot-boundp-using-class class obj slot)
- (slot-value-using-class class obj slot)
- magic)))
- (class-slots class)))
- (format stream "~S" (class-name class))
- (let ((sep nil))
- (loop
- (pprint-exit-if-list-exhausted)
- (if sep
- (format stream " ~_")
- (progn (format stream " ~@_~:I") (setf sep t)))
- (let ((name (pprint-pop))
- (value (pprint-pop)))
- (format stream "~S ~@_~:[~W~;#<unbound>~*~]"
- name (eq value magic) value))))))))
+ (stream
+ (mapcan (lambda (slot)
+ (list (or (car (slot-definition-initargs slot))
+ (slot-definition-name slot))
+ (if (slot-boundp-using-class class obj slot)
+ (slot-value-using-class class obj slot)
+ magic)))
+ (class-slots class)))
+ (format stream "~S" (class-name class))
+ (let ((sep nil))
+ (loop
+ (pprint-exit-if-list-exhausted)
+ (if sep
+ (format stream " ~_")
+ (progn (format stream " ~@_~:I") (setf sep t)))
+ (let ((name (pprint-pop))
+ (value (pprint-pop)))
+ (format stream "~S ~@_~:[~W~;#<unbound>~*~]"
+ name (eq value magic) value))))))))
;;;----- That's all, folks --------------------------------------------------