[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Changing a cl-defstruct definition in a published package

From: Clément Pit-Claudel
Subject: Changing a cl-defstruct definition in a published package
Date: Thu, 12 Jul 2018 16:12:54 -0400
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.8.0

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)
    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?


reply via email to

[Prev in Thread] Current Thread [Next in Thread]