emacs-devel
[Top][All Lists]
Advanced

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

pcase map binding form expansion failure on Emacs 27 only


From: Adam Porter
Subject: pcase map binding form expansion failure on Emacs 27 only
Date: Tue, 07 Sep 2021 07:08:56 -0500
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/26.3 (gnu/linux)

Hi,

I've come upon a very strange--to me, anyway--problem: When
byte-compiling a file at package installation time or in a batch
session, this pcase binding form:

  (pcase-let* (((map :max-width) plist))
    max-width)

correctly expands to this, on Emacs 26.3 and 28.0.50:

  (let* ((x6 (map-elt plist :max-width)))
    (let ((max-width x6))
      max-width))

However, on Emacs 27, it incorrectly expands to:

  (let* ((x6 (map-elt plist ':max-width)))
    (progn max-width))

This leads to warnings, errors, complete failure of the installed
package, and repeated bug reports.  In these reports, sometimes users
reinstall the package in question (sometimes after deleting the package
and restarting Emacs) and see the problem resolved, and in other cases,
nothing works.  (And sometimes the package author mistakenly accuses the
users of having configuration problems (which, sometimes, they did, but
not always).)

I confirmed that this happens even though map.el is installed at version
3.1, and even though that version is actually loaded, by using this form
in the file:

  (eval-when-compile
    (save-excursion
      (message "MAP VERSION IS: %S"
               (package-desc-version (car (alist-get 'map package-alist))))
      (message "MAP IS AT: %S"
               (locate-library "map"))
      (message "EXPANSION TEST: %S"
               (macroexpand-all '(pcase-let* (((map :max-width) plist))
                                   max-width)))))

Which produces output like (using my makem.sh script[0], which I use for
linting and testing Emacs packages locally and on CI):

  LOG (2021-09-07 11:31:03): Compiling file: bufler-workspace.el...
  MAP VERSION IS: (3 1)
  MAP IS AT: "/tmp/tmp.cEPHlNUWYk/27.1/elpa/map-3.1/map.elc"
  EXPANSION TEST: (let* ((x6 (map-elt plist ':max-width))) (progn max-width))
  Eager macro-expansion failure: (void-variable max-width)

Even though I submitted the (very small) patch to map.el that added
support for the (map :KEYWORD) binding form, I finally had to give in
and apply a workaround in my package, using this binding form instead:

  ((map (:face face) (:max-width max-width)) plist)

That form correctly expands on Emacs 26.3, 27, and 28.0.50.  So at least
I won't get any more bug reports about this problem on my package.

But I would like to understand what's going on here, if possible.  I'm
pretty sure that there's no bug in my code: my the package depends on
map 3.1, that version gets installed before my package does, that
version is loaded before my package is compiled, and my package does
(require 'map).  I can't find any reason for it to only fail on Emacs
27.  And since it's not only happening in my testing, but in the wild,
something certainly seems fishy.

The bug report on my package may be found at
<https://github.com/alphapapa/bufler.el/issues/70>, but it's long, and
I've reproduced the relevant parts here, so hopefully it won't be
necessary to refer to it.

I considered filing this as a bug report, but since Emacs 27 probably
won't get any new releases IIUC, and since I don't think it's a bug in
map.el, a discussion here seemed more appropriate.

Thanks for any help,
Adam

0: https://github.com/alphapapa/makem.sh




reply via email to

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