all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: "Basil L. Contovounesios" <contovob@tcd.ie>
To: "João Távora" <joaotavora@gmail.com>
Cc: "Clément Pit-Claudel" <cpitclaudel@gmail.com>,
	emacs-devel <emacs-devel@gnu.org>
Subject: Re: Changing a cl-defstruct definition in a published package
Date: Fri, 13 Jul 2018 20:38:20 +0300	[thread overview]
Message-ID: <87lgaf3uk3.fsf@tcd.ie> (raw)
In-Reply-To: CALDnm535TGNV0TYwY1jFq0ktCkiRC1fpg0EMSJ1w2-64sbN=Mw@mail.gmail.com

João Távora <joaotavora@gmail.com> writes:

> On Thu, Jul 12, 2018, 21:13 Clément Pit-Claudel <cpitclaudel@gmail.com> wrote:
>
>>  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?
>
> There's no way to fix the problem now without breaking backward
> compatibility because by now B's use of your accessor has been
> compiled into something that probably looks like an aref into an
> array.  So if you change your object layout in A, you break a compiled
> B.
>
> The way to avoid this beforehand is not to expose the defstruct's
> accessors as a public interface.  You can't think of them as
> functions, because they have compiler macros associated.  The easiest
> "solution" now is to make proper functions for those accessors that
> are public, and then having B recompiled.  Also consider if you really
> need defstructs for their speed, because they're usually an array in
> disguise.  Perhaps a (slightly, in most cases) slower eieio class
> would do.

If cl-defstructs boil down to an array in disguise (I don't know because
I've never looked into them), would appending (as opposed to prepending
or inserting) new slots maintain backward compatibility?  E.g. going
from:

  (cl-defstruct aaa-info
    line message)

to:

  (cl-defstruct aaa-info
    line message column)

instead of:

  (cl-defstruct aaa-info
    line column message)

(despite my finding the latter aesthetically nicer, as it groups line
and column together).

-- 
Basil



  reply	other threads:[~2018-07-13 17:38 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
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 [this message]
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

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87lgaf3uk3.fsf@tcd.ie \
    --to=contovob@tcd.ie \
    --cc=cpitclaudel@gmail.com \
    --cc=emacs-devel@gnu.org \
    --cc=joaotavora@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

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

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.