X-Git-Url: https://git.distorted.org.uk/~mdw/lisp/blobdiff_plain/0eed4749891adf0a7be89e786b8968ee805a8d41..77f935dafbb63f1674a3df832972fda67c10e3d6:/mdw-mop.lisp diff --git a/mdw-mop.lisp b/mdw-mop.lisp index e744fcd..01c829c 100644 --- a/mdw-mop.lisp +++ b/mdw-mop.lisp @@ -1,7 +1,5 @@ ;;; -*-lisp-*- ;;; -;;; $Id$ -;;; ;;; Useful bits of MOP hacking ;;; ;;; (c) 2006 Straylight/Edgeware @@ -30,25 +28,14 @@ (: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 - #:initargs-for-effective-slot #:make-effective-slot - #:filtered-slot-class-mixin - #:filtered-direct-slot-definition - #:filtered-effective-slot-definition - #:predicate-class-mixin - #:abstract-class-mixin #:instantiate-abstract-class - #:singleton-class-mixin - #:mdw-class #:abstract-class #:singleton-class - #:print-object-with-slots)) + #+ecl #:clos)) (in-package #:mdw.mop) ;;;-------------------------------------------------------------------------- ;;; Copying instances. +(export 'copy-instance-using-class) (defgeneric copy-instance-using-class (class object &rest initargs) (:documentation "Does the donkey-work behind copy-instance.")) @@ -62,6 +49,7 @@ (apply #'shared-initialize new nil initargs) new)) +(export 'copy-instance) (defun copy-instance (object &rest initargs) "Make a copy of OBJECT, modifying it by setting slots as requested by INITARGS." @@ -70,6 +58,7 @@ ;;;-------------------------------------------------------------------------- ;;; Handy macros. +(export 'with-slot-variables) (defmacro with-slot-variables (slots instance &body body) "A copy-out-and-write-back variant of with-slots. @@ -139,6 +128,7 @@ ;;;-------------------------------------------------------------------------- ;;; Basic stuff. +(export 'compatible-class) (defclass compatible-class (standard-class) () (:documentation @@ -161,6 +151,7 @@ ;;;-------------------------------------------------------------------------- ;;; Utilities for messing with slot options. +(export 'initargs-for-effective-slot) (defgeneric initargs-for-effective-slot (class direct-slots) (:documentation "Missing functionality from the MOP: given a class and its direct slots @@ -185,8 +176,9 @@ direct-slots))) :allocation (slot-definition-allocation (car direct-slots))))) +(export 'make-effective-slot) (defun make-effective-slot (class initargs) - "Construct an effectie slot definition for a slot on the class, given the + "Construct an effective slot definition for a slot on the class, given the required arguments." (apply #'make-instance (apply #'effective-slot-definition-class class initargs) @@ -212,6 +204,7 @@ ;;;-------------------------------------------------------------------------- ;;; Filterered slots. +(export 'filtered-slot-class-mixin) (defclass filtered-slot-class-mixin (compatible-class) () (:documentation @@ -224,10 +217,12 @@ (defgeneric slot-definition-filter (slot) (:method ((slot slot-definition)) nil)) +(export 'filtered-direct-slot-definition) (defclass filtered-direct-slot-definition (standard-direct-slot-definition) ((filter :initarg :filter :reader slot-definition-filter))) +(export 'filtered-effective-slot-definition) (defclass filtered-effective-slot-definition (standard-effective-slot-definition) ((filter :initarg :filter :accessor slot-definition-filter))) @@ -276,6 +271,7 @@ ;;;-------------------------------------------------------------------------- ;;; Predicates. +(export 'predicate-class-mixin) (defclass predicate-class-mixin (compatible-class) ((predicates :type list :initarg :predicate :initform nil :documentation "Predicate generic function to create.")) @@ -310,12 +306,14 @@ ;;;-------------------------------------------------------------------------- ;;; Abstract classes. +(export 'abstract-class-mixin) (defclass abstract-class-mixin (compatible-class) () (:documentation "Confusingly enough, a concrete metaclass for abstract classes. This class has a `make-instance' implementation which signals an error.")) +(export '(instantiate-abstract-class instantiate-abstract-class-class)) (define-condition instantiate-abstract-class (error) ((class :reader instantiate-abstract-class-class :initarg :class :documentation "The class someone attempted to instantiate.")) @@ -333,6 +331,7 @@ ;;;-------------------------------------------------------------------------- ;;; Singleton classes. +(export 'singleton-class-mixin) (defclass singleton-class-mixin (compatible-class) ((instance :initform nil :type (or null standard-object))) (:documentation @@ -349,6 +348,7 @@ ;;;-------------------------------------------------------------------------- ;;; Useful classes. +(export 'mdw-class) (defclass mdw-class (filtered-slot-class-mixin predicate-class-mixin compatible-class) @@ -359,12 +359,16 @@ metaclass for all your classes if you don't use any of its fancy features.")) +(export 'abstract-class) (defclass abstract-class (mdw-class abstract-class-mixin) ()) + +(export 'singleton-class) (defclass singleton-class (mdw-class singleton-class-mixin) ()) ;;;-------------------------------------------------------------------------- ;;; Printing things. +(export 'print-object-with-slots) (defun print-object-with-slots (obj stream) "Prints objects in a pleasant way. Not too clever about circularity." (let ((class (class-of obj))