|
From: | João Távora |
Subject: | Re: Changing a cl-defstruct definition in a published package |
Date: | Fri, 13 Jul 2018 18:01:29 +0100 |
Hi all,
I'm sure this has already been discussed, but I couldn't find the relevant discussion. I'm running into issues trying to update a package without breaking other packages that depend on it. Advice would be very welcome.
I maintain package A, which contains this:
(cl-defstruct aaa-info
line message)
(provide 'aaa)
Someone else wrote a package B that contains this:
(require 'aaa)
(defun bbb-print-message (info)
(message (aaa-info-message info)))
(provide 'bbb)
Users have installed both packages through package.el. I update A by adding a new field to the definition of aaa-info, and push the update to ELPA or MELPA:
(cl-defstruct aaa-info
line column message)
Users update using package.el, but this does not cause b to be recompiled. From this point on, any subsequent call to bbb-print-message to bbb-print-message fails: for example, (bbb-print-message (make-aaa-info :line 1 :column 2 :message "XYZ")) prints this:
Debugger entered--Lisp error: (wrong-type-argument stringp 2)
message(2)
bbb-print-message(#s(aaa-info :line 1 :column 2 :message "XYZ"))
Similarly, if I update the constructor of aaa-info to give the new 'column' field a default value, instances created by the previously-compiled B will still be missing the 'column' slot, leading to all sorts of errors.
What is the recommended way to change a cl-defstruct definition without running into these issues?
Thanks!
Clément.
[Prev in Thread] | Current Thread | [Next in Thread] |