unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* Changing a cl-defstruct definition in a published package
@ 2018-07-12 20:12 Clément Pit-Claudel
  2018-07-13 17:01 ` João Távora
  0 siblings, 1 reply; 20+ messages in thread
From: Clément Pit-Claudel @ 2018-07-12 20:12 UTC (permalink / raw)
  To: Emacs developers

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. 



^ permalink raw reply	[flat|nested] 20+ messages in thread
* Re: Changing a cl-defstruct definition in a published package
@ 2018-07-19 20:27 Jake
  2018-07-19 21:10 ` Stefan Monnier
  0 siblings, 1 reply; 20+ messages in thread
From: Jake @ 2018-07-19 20:27 UTC (permalink / raw)
  To: monnier@iro.umontreal.ca; +Cc: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 903 bytes --]

I've seen another work around to detect whether or not a file is being
byte-compiled in use-package
<https://github.com/jwiegley/use-package/blob/master/use-package-ensure.el#L192-L197>:
(bound-and-true-p byte-compile-current-file).

It seems to work, as illustrated by this example:

(message
 (eval-when-compile
   (if (bound-and-true-p byte-compile-current-file)
       "I'm being byte-compiled!"
     "I'm being evaluated :(")))

When I byte compile that and then evaluate

(progn
  (load-file "~/byte-compile-test.elc")
  (load-file "~/byte-compile-test.el"))

It prints out

Loading /Users/jake.waksbaum/byte-compile-test.elc...
I’m being byte-compiled!
Loading /Users/jake.waksbaum/byte-compile-test.elc...done
Loading /Users/jake.waksbaum/byte-compile-test.el (source)...
I’m being evaluated :(
Loading /Users/jake.waksbaum/byte-compile-test.el (source)...done
t

[-- Attachment #2: Type: text/html, Size: 1805 bytes --]

^ permalink raw reply	[flat|nested] 20+ messages in thread

end of thread, other threads:[~2018-07-31  3:28 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-07-12 20:12 Changing a cl-defstruct definition in a published package Clément Pit-Claudel
2018-07-13 17:01 ` João Távora
2018-07-13 17:38   ` Basil L. Contovounesios
2018-07-13 18:21     ` Clément Pit-Claudel
2018-07-13 18:26   ` Clément Pit-Claudel
2018-07-13 19:38     ` João Távora
2018-07-13 19:52       ` Clément Pit-Claudel
2018-07-13 20:40         ` Stefan Monnier
2018-07-13 21:07           ` Clément Pit-Claudel
2018-07-14  3:36             ` Stefan Monnier
2018-07-15  4:25               ` Clément Pit-Claudel
2018-07-15 13:11                 ` Stefan Monnier
2018-07-15 13:25                   ` Clément Pit-Claudel
2018-07-16  1:51                     ` Stefan Monnier
2018-07-30 21:52                       ` Clément Pit-Claudel
2018-07-30 22:49                         ` Stefan Monnier
2018-07-31  3:28                           ` Clément Pit-Claudel
  -- strict thread matches above, loose matches on Subject: below --
2018-07-19 20:27 Jake
2018-07-19 21:10 ` Stefan Monnier
2018-07-19 21:34   ` Jake

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).