src/class-make-{proto,impl}.lisp: Don't always add initializers to classes.
authorMark Wooding <mdw@distorted.org.uk>
Sun, 6 Oct 2019 21:50:42 +0000 (22:50 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Sun, 6 Oct 2019 23:18:28 +0000 (00:18 +0100)
Add a switch `:add-to-class' to inhibit adding the new initializer
object to its class.

(The class is still necessary because it's in control of initializer
construction: otherwise I'd do this by passing a `nil' class.)

doc/meta.tex
src/class-make-impl.lisp
src/class-make-proto.lisp

index 67e77b2..dc06abf 100644 (file)
     {\dhead{gf}
       {make-sod-instance-initializer
           \=@<class> @<nick> @<name> @<value> @<pset> \\
-          \>\&key :inhibit-initargs :location
+          \>\&key :inhibit-initargs :location :add-to-class
         \nlret @<init>}
      \dhead{gf}
       {make-sod-class-initializer
-          \=@<class> @<nick> @<name> @<value> @<pset> \&key :location
+          \=@<class> @<nick> @<name> @<value> @<pset> \\
+          \>\&key :location :add-to-class
         \nlret @<init>}}
 \end{describe*}
 
index 1da8bac..02fd5f5 100644 (file)
 ;;; Slot initializers.
 
 (defmethod make-sod-instance-initializer
-    ((class sod-class) nick name value pset &key location inhibit-initargs)
+    ((class sod-class) nick name value pset
+     &key location inhibit-initargs (add-to-class t))
   (with-default-error-location (location)
     (let* ((slot (find-instance-slot-by-name class nick name))
           (initarg-name (get-property pset :initarg :id))
        (when (and initarg-name (not inhibit-initargs))
          (make-sod-slot-initarg-using-slot class initarg-name slot pset
                                            :location location))
-       (when initializer
+       (when (and initializer add-to-class)
          (setf instance-initializers
                (append instance-initializers (list initializer)))))
       initializer)))
 
 (defmethod make-sod-class-initializer
-    ((class sod-class) nick name value pset &key location)
+    ((class sod-class) nick name value pset &key location (add-to-class t))
   (with-default-error-location (location)
     (let* ((slot (find-class-slot-by-name class nick name))
           (initializer (make-sod-initializer-using-slot
                         class slot 'sod-class-initializer
                         value pset (file-location location))))
-      (with-slots (class-initializers) class
-       (setf class-initializers
-             (append class-initializers (list initializer))))
+      (when add-to-class
+       (with-slots (class-initializers) class
+         (setf class-initializers
+               (append class-initializers (list initializer)))))
       initializer)))
 
 (defmethod make-sod-initializer-using-slot
index 5622dc6..09b9f98 100644 (file)
@@ -86,7 +86,7 @@
 
 (export 'make-sod-instance-initializer)
 (defgeneric make-sod-instance-initializer
-    (class nick name value pset &key location inhibit-initargs)
+    (class nick name value pset &key location inhibit-initargs add-to-class)
   (:documentation
    "Construct and attach an instance slot initializer, to CLASS.
 
@@ -95,7 +95,7 @@
    construction process.  The default method looks up the slot using
    `find-instance-slot-by-name', calls `make-sod-initializer-using-slot' to
    actually make the initializer object, and adds it to the appropriate list
-   in CLASS.
+   in CLASS unless ADD-TO-CLASS is nil.
 
    Usually, if an `initarg' property is set on PSET, then a slot initarg is
    created and attached to the slot; this can be prevented by setting
 
 (export 'make-sod-class-initializer)
 (defgeneric make-sod-class-initializer
-    (class nick name value pset &key location)
+    (class nick name value pset &key location add-to-class)
   (:documentation
    "Construct and attach a class slot initializer, to CLASS.
 
    construction process.  The default method looks up the slot using
    `find-class-slot-by-name', calls `make-sod-initializer-using-slot' to
    actually make the initializer object, and adds it to the appropriate list
-   in CLASS."))
+   in CLASS unless ADD-TO-CLASS is nil."))
 
 (export 'make-sod-initializer-using-slot)
 (defgeneric make-sod-initializer-using-slot