From: Mark Wooding Date: Sat, 3 Aug 2019 14:20:46 +0000 (+0100) Subject: src/class-make-{proto,impl}.lisp: Don't make duplicate initargs. X-Git-Url: https://git.distorted.org.uk/~mdw/sod/commitdiff_plain/03570bbb9027efe5485d4776fc22d93ad410a892?hp=81054f0131824964d2cebfd7dec6f18be113020b src/class-make-{proto,impl}.lisp: Don't make duplicate initargs. If you set an initarg property on a slot definition which includes an initializer then both the slot definition and the initializer act on the initarg property and you end up with two initargs. This isn't actually a major problem, but it's ugly. Add a new keyword argument to `make-sod-instance-initializer' to prevent this from happening. --- diff --git a/doc/meta.tex b/doc/meta.tex index 2d1a577..4b42a86 100644 --- a/doc/meta.tex +++ b/doc/meta.tex @@ -166,7 +166,8 @@ \begin{describe*} {\dhead{gf} {make-sod-instance-initializer - \=@ @ @ @ @ \&key :location + \=@ @ @ @ @ \\ + \>\&key :inhibit-initargs :location \nlret @} \dhead{gf} {make-sod-class-initializer diff --git a/src/class-make-impl.lisp b/src/class-make-impl.lisp index 5fe9de7..4785d9c 100644 --- a/src/class-make-impl.lisp +++ b/src/class-make-impl.lisp @@ -115,7 +115,7 @@ ;;; Slot initializers. (defmethod make-sod-instance-initializer - ((class sod-class) nick name value pset &key location) + ((class sod-class) nick name value pset &key location inhibit-initargs) (with-default-error-location (location) (let* ((slot (find-instance-slot-by-name class nick name)) (initarg-name (get-property pset :initarg :id)) @@ -126,7 +126,7 @@ (with-slots (instance-initializers) class (unless (or initarg-name initializer) (error "Slot initializer declaration with no effect")) - (when initarg-name + (when (and initarg-name (not inhibit-initargs)) (make-sod-slot-initarg-using-slot class initarg-name slot pset :location location)) (when initializer diff --git a/src/class-make-proto.lisp b/src/class-make-proto.lisp index a2783ee..5622dc6 100644 --- a/src/class-make-proto.lisp +++ b/src/class-make-proto.lisp @@ -86,7 +86,7 @@ (export 'make-sod-instance-initializer) (defgeneric make-sod-instance-initializer - (class nick name value pset &key location) + (class nick name value pset &key location inhibit-initargs) (:documentation "Construct and attach an instance slot initializer, to CLASS. @@ -95,7 +95,13 @@ 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. + + 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 + INHIBIT-INITARGS non-nil. This is needed when creating a slot and + initializer from the same property set, in order to prevent creation of a + duplicate initarg.")) (export 'make-sod-class-initializer) (defgeneric make-sod-class-initializer