GNU bug report logs - #67991
30.0.50; boundp always returns nil in format-mode-line with let* after 0fde935

Previous Next

Package: emacs;

Reported by: Aaron Jensen <aaronjensen <at> gmail.com>

Date: Sat, 23 Dec 2023 14:53:02 UTC

Severity: normal

Found in version 30.0.50

To reply to this bug, email your comments to 67991 AT debbugs.gnu.org.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to bug-gnu-emacs <at> gnu.org:
bug#67991; Package emacs. (Sat, 23 Dec 2023 14:53:02 GMT) Full text and rfc822 format available.

Acknowledgement sent to Aaron Jensen <aaronjensen <at> gmail.com>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs <at> gnu.org. (Sat, 23 Dec 2023 14:53:02 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Aaron Jensen <aaronjensen <at> gmail.com>
To: bug-gnu-emacs <at> gnu.org
Cc: monnier <at> iro.umontreal.ca
Subject: 30.0.50; boundp always returns nil in format-mode-line with let*
 after 0fde935
Date: Sat, 23 Dec 2023 09:51:50 -0500
After commits:

0fde935b66e43e4d7ec137ba6195de993168587a
a63b206fbde2ead91f1053d80a275f8850e5ffce

boundp returns nil here, rather than t, like it used to:

(format-mode-line
 '(:eval (let* ((some-var "some-value")
                (_ (message "Bound: %S" (boundp 'some-var))))
           (message "Var: %S, Bound: %S" some-var (boundp 'some-var)))))

This has an impact on a particular package I use for my modeline, which
can be worked around if this behavior is expected. It seemed a
significant chagne, so I wanted to report it, in case it was not expected.



In GNU Emacs 30.0.50 (build 1, aarch64-apple-darwin23.1.0, NS
 appkit-2487.20 Version 14.1.1 (Build 23B2082)) of 2023-11-17 built on
 Aarons-MacBook-Pro.local
Windowing system distributor 'Apple', version 10.3.2487
System Description:  macOS 14.2.1

Configured using:
 'configure --disable-dependency-tracking --disable-silent-rules
 --enable-locallisppath=/opt/homebrew/share/emacs/site-lisp
 --infodir=/opt/homebrew/Cellar/emacs-plus <at> 30/30.0.50/share/info/emacs
 --prefix=/opt/homebrew/Cellar/emacs-plus <at> 30/30.0.50 --with-xml2
 --with-gnutls --with-native-compilation --without-compress-install
 --without-dbus --without-imagemagick --with-modules --with-rsvg
 --with-webp --with-ns --disable-ns-self-contained 'CFLAGS=-Os -w -pipe
 -mmacosx-version-min=14
 -isysroot/Library/Developer/CommandLineTools/SDKs/MacOSX14.sdk
 -DFD_SETSIZE=10000 -DDARWIN_UNLIMITED_SELECT'
 'CPPFLAGS=-I/opt/homebrew/opt/zlib/include
 -I/opt/homebrew/opt/jpeg/include -I/opt/homebrew/opt/icu4c/include
 -isystem/opt/homebrew/include -F/opt/homebrew/Frameworks
 -isysroot/Library/Developer/CommandLineTools/SDKs/MacOSX14.sdk'
 'LDFLAGS=-L/opt/homebrew/opt/zlib/lib -L/opt/homebrew/opt/jpeg/lib
 -L/opt/homebrew/opt/icu4c/lib -L/opt/homebrew/lib
 -F/opt/homebrew/Frameworks -Wl,-headerpad_max_install_names
 -isysroot/Library/Developer/CommandLineTools/SDKs/MacOSX14.sdk
 -L/opt/homebrew/opt/libgccjit/lib''

Configured features:
ACL GIF GLIB GMP GNUTLS JPEG JSON LCMS2 LIBXML2 MODULES NATIVE_COMP
NOTIFY KQUEUE NS PDUMPER PNG RSVG SQLITE3 THREADS TIFF
TOOLKIT_SCROLL_BARS TREE_SITTER WEBP XIM ZLIB

Important settings:
  value of $LANG: en_US.UTF-8
  locale-coding-system: utf-8-unix

Major mode: Org

Minor modes in effect:
  windmove-mode: t
  global-flycheck-mode: t
  flycheck-mode: t
  global-evil-mc-mode: t
  evil-mc-mode: t
  global-git-commit-mode: t
  transient-posframe-mode: t
  corfu-prescient-mode: t
  corfu-history-mode: t
  eval-sexp-fu-flash-mode: t
  eros-mode: t
  speed-of-thought-mode: t
  global-evil-surround-mode: t
  evil-surround-mode: t
  tabspaces-mode: t
  flyspell-mode: t
  org-indent-mode: t
  org-appear-mode: t
  orgonomic-mode: t
  org-superstar-mode: t
  form-feed-mode: t
  org-roam-db-autosync-mode: t
  evil-org-mode: t
  undo-fu-session-global-mode: t
  undo-fu-session-mode: t
  ws-butler-global-mode: t
  ws-butler-mode: t
  yas-global-mode: t
  yas-minor-mode: t
  vertico-prescient-mode: t
  prescient-persist-mode: t
  vertico-mouse-mode: t
  vertico-mode: t
  mini-frame-mode: t
  better-jumper-mode: t
  better-jumper-local-mode: t
  ns-auto-titlebar-mode: t
  global-anzu-mode: t
  anzu-mode: t
  which-key-posframe-mode: t
  which-key-mode: t
  gcmh-mode: t
  xterm-mouse-mode: t
  global-auto-revert-mode: t
  save-place-mode: t
  winner-mode: t
  savehist-mode: t
  delete-selection-mode: t
  recentf-mode: t
  repeat-mode: t
  +popup-mode: t
  evil-mode: t
  evil-local-mode: t
  server-mode: t
  leader-key-leader-override-mode: t
  global-leader-key-leader-override-mode: t
  elpaca-use-package-mode: t
  override-global-mode: t
  global-display-line-numbers-mode: t
  global-eldoc-mode: t
  show-paren-mode: t
  electric-indent-mode: t
  mouse-wheel-mode: t
  prettify-symbols-mode: t
  tab-bar-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  window-divider-mode: t
  minibuffer-regexp-mode: t
  line-number-mode: t
  auto-fill-function: #[128 \304\300\301%3#\207 [yas--auto-fill org-auto-fill-function :around nil apply] 5 advice]
  transient-mark-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t
  abbrev-mode: t

Load-path shadows:
/Users/aaronjensen/.emacs.d/elpaca/builds/lispy/elpa hides /Users/aaronjensen/.emacs.d/elpaca/builds/ivy/elpa

Features:
(shadow sort mail-extr emacsbug evil-matchit-simple evil-matchit-prog
evil-matchit evil-matchit-sdk semantic/lex semantic/fw
evil-collection-help hippie-exp evil-collection-helpful helpful cc-langs
cc-vars cc-defs trace info-look elisp-refs hide-mode-line info
magit-patch magit-subtree magit-gitignore magit-ediff
evil-collection-ediff ediff ediff-merg ediff-mult ediff-wind ediff-diff
ediff-help ediff-init ediff-util magit-extras vc-hg vc-bzr vc-src
vc-sccs vc-svn vc-cvs vc-rcs log-view bug-reference elpaca-log elpaca-ui
popup-mode-core windmove evil-terminal-cursor-changer color executable
flycheck evil-mc evil-mc-command-execute evil-mc-command-record
evil-mc-cursor-make evil-mc-region evil-mc-cursor-state evil-mc-undo
evil-mc-vars evil-mc-known-commands evil-mc-common magit-delta
xterm-color evil-collection-magit magit-submodule magit-blame
magit-stash magit-reflog magit-bisect magit-push magit-pull magit-fetch
magit-clone magit-remote magit-commit magit-sequence magit-notes
magit-worktree magit-tag magit-merge magit-branch magit-reset
magit-files magit-refs magit-status magit package url-handlers
magit-repos magit-apply magit-wip magit-log which-func magit-diff
smerge-mode diff git-commit log-edit pcvs-util add-log magit-core
magit-autorevert magit-margin magit-transient magit-process with-editor
magit-mode transient-posframe transient magit-git magit-base crm
vertico-directory cape corfu-prescient corfu-history corfu dtrt-indent
eval-sexp-fu eros lispyville lispy lispy-inline avy etags fileloop
evil-collection-edebug edebug lispy-tags mode-local zoutline elisp-def
ert ewoc evil-collection-xref xref f f-shortdoc sotlisp skeleton
elec-pair envrc inheritenv evil-surround evil-matchit-evil-setup
tabspaces dired-x vc vc-git diff-mode vc-dispatcher flyspell ispell
org-indent org-appear orgonomic org-superstar form-feed oc-basic ol-eww
eww url-queue mm-url ol-rmail ol-mhe ol-irc ol-info ol-gnus nnselect
gnus-art mm-uu mml2015 mm-view mml-smime smime gnutls dig gnus-sum shr
pixel-fill kinsoku url-file svg dom browse-url gnus-group gnus-undo
gnus-start gnus-dbus dbus xml gnus-cloud nnimap nnmail mail-source utf7
nnoo parse-time gnus-spec gnus-int gnus-range message sendmail
yank-media rfc822 mml mml-sec epa epg rfc6068 epg-config mm-decode
mm-bodies mm-encode mailabbrev gmm-utils mailheader gnus-win gnus
nnheader gnus-util mail-utils range ol-docview doc-view jka-compr
image-mode exif dired dired-loaddefs ol-bibtex bibtex iso8601 ol-bbdb
ol-w3m ol-doi org-link-doi org-download url-http url url-proxy
url-privacy url-expand url-methods url-history mailcap url-auth
mail-parse rfc2231 rfc2047 rfc2045 mm-util ietf-drums mail-prsvr
url-cookie generate-lisp-file url-domsuf url-util url-gw nsm puny async
vulpea vulpea-meta vulpea-select vulpea-buffer vulpea-db s vulpea-utils
vulpea-note org-roam-migrate org-roam-log org-roam-mode org-roam-capture
org-roam-id org-roam-node org-roam-db emacsql-sqlite-builtin sqlite
org-roam-utils org-roam-compat org-roam org-mac-link org-goto
org-capture org-attach emacsql-sqlite emacsql-sqlite-common emacsql
emacsql-compiler magit-section cursor-sensor dash evil-org-agenda
evil-org imenu ox-odt rng-loc rng-uri rng-parse rng-match rng-dt
rng-util rng-pttrn nxml-parse nxml-ns nxml-enc xmltok nxml-util ox-latex
ox-icalendar org-agenda ox-ascii ox-gfm ox-md ox-html table ox-publish
ox org-element org-persist xdg org-id org-refile avl-tree generator
org-tempo tempo ob-shell shell org ob ob-tangle ob-ref ob-lob ob-table
ob-exp org-macro org-src ob-comint org-pcomplete pcomplete org-list
org-footnote org-faces org-entities noutline outline ob-emacs-lisp
ob-core ob-eval org-cycle org-table ol org-fold org-fold-core org-keys
oc org-loaddefs cal-menu calendar cal-loaddefs org-version org-compat
org-macs format-spec undo-fu-session ws-butler yasnippet
vertico-prescient prescient char-fold vertico-mouse vertico mini-frame
better-jumper ns-auto-titlebar evil-anzu anzu which-key-posframe
posframe evil-collection-which-key which-key gcmh help-fns radix-tree
cl-print xt-mouse autorevert filenotify saveplace winner hl-line
evil-collection-ibuffer ibuffer ibuffer-loaddefs savehist delsel
popup-mode-hacks evil-collection-debug debug backtrace find-func recentf
tree-widget repeat orderless popup-mode popup-mode-settings
evil-collection annalist evil-little-word cus-edit cus-start cus-load
wid-edit pp evil evil-integration evil-maps evil-commands reveal
evil-jumps evil-command-window evil-types evil-search evil-ex
evil-macros evil-repeat evil-states evil-core project advice evil-common
thingatpt rect evil-vars memoize nano-modeline nano-light-theme
face-remap nano-theme disp-table gcmh-autoloads copy-as-format-autoloads
pdf-tools-autoloads tablist-autoloads restclient-autoloads
vterm-autoloads dumb-jump-autoloads popup-autoloads haml-mode-autoloads
emmet-mode-autoloads terraform-mode-autoloads hcl-mode-autoloads
dockerfile-mode-autoloads yaml-mode-autoloads json-mode-autoloads
json-snatcher-autoloads grip-mode-autoloads lua-mode-autoloads
bundler-autoloads inf-ruby-autoloads ruby-refactor-autoloads
evil-ruby-text-objects-autoloads sotlisp-autoloads elisp-def-autoloads
lispyville-autoloads lispy-autoloads iedit-autoloads swiper-autoloads
ivy-autoloads zoutline-autoloads eros-autoloads eval-sexp-fu-autoloads
web-mode-autoloads ripgrep-capf-autoloads git-link-autoloads
consult-git-commit-autoloads git-timemachine-autoloads
magit-delta-autoloads xterm-color-autoloads prettier-autoloads
iter2-autoloads nvm-autoloads editorconfig-autoloads flycheck-autoloads
pkg-info-autoloads epl-autoloads lsp-ui-autoloads lsp-mode-autoloads
spinner-autoloads markdown-mode-autoloads denote-autoloads
imenu-list-autoloads org-superstar-autoloads ox-gfm-autoloads
org-pandoc-import-autoloads gnuplot-autoloads org-download-autoloads
async-autoloads org-journal-autoloads vulpea-autoloads
org-roam-autoloads emacsql-autoloads orgonomic-autoloads
org-drill-autoloads persist-autoloads org-appear-autoloads
org-mac-link-autoloads evil-org-autoloads
evil-terminal-cursor-changer-autoloads transient-posframe-autoloads
better-jumper-autoloads buffer-move-autoloads rotate-autoloads
mini-frame-autoloads embark-consult-autoloads embark-autoloads
consult-autoloads orderless-autoloads cape-autoloads
corfu-prescient-autoloads corfu-autoloads vertico-prescient-autoloads
vertico-autoloads prescient-autoloads tabspaces-autoloads
which-key-posframe-autoloads which-key-autoloads popup-mode-autoloads
hide-mode-line-autoloads evil-anzu-autoloads anzu-autoloads
titlecase-autoloads wgrep-autoloads yasnippet-autoloads
form-feed-autoloads drag-stuff-autoloads dtrt-indent-autoloads
ws-butler-autoloads evil-collection-autoloads annalist-autoloads
evil-mc-autoloads evil-numbers-autoloads speeddating-autoloads
evil-little-word-autoloads evil-matchit-autoloads
evil-nerd-commenter-autoloads evil-visualstar-autoloads
evil-surround-autoloads vundo-autoloads undo-fu-session-autoloads
ztree-autoloads dwim-shell-command-autoloads treemacs-tab-bar-autoloads
treemacs-magit-autoloads magit-autoloads git-commit-autoloads
magit-section-autoloads with-editor-autoloads treemacs-evil-autoloads
evil-autoloads goto-chg-autoloads treemacs-autoloads
ace-window-autoloads avy-autoloads pfuture-autoloads ht-autoloads
cfrs-autoloads all-the-icons-autoloads rainbow-mode-autoloads
posframe-autoloads ns-auto-titlebar-autoloads nano-modeline-autoloads
nano-theme-autoloads memoize-autoloads envrc-autoloads
inheritenv-autoloads helpful-autoloads f-autoloads elisp-refs-autoloads
s-autoloads dired-subtree-autoloads dired-hacks-utils-autoloads
dash-autoloads server pcase hydra lv url-parse auth-source eieio
eieio-core password-cache json map url-vars edmacro kmacro byte-opt
compdef derived leader-key bind-map no-littering compat
compdef-autoloads hydra-autoloads lv-autoloads leader-key-autoloads
bind-map-autoloads no-littering-autoloads compat-autoloads
elpaca-use-package use-package use-package-ensure use-package-delight
use-package-diminish use-package-bind-key bind-key easy-mmode
use-package-core elpaca-use-package-autoloads compile
text-property-search comint ansi-osc ansi-color ring time-date comp-run
cl-macs elpaca elpaca-process elpaca-autoloads comp cl-seq comp-cstr
comp-common warnings subr-x rx gv bytecomp byte-compile cl-extra
help-mode icons cl-loaddefs cl-lib display-line-numbers rmc iso-transl
tooltip cconv eldoc paren electric uniquify ediff-hook vc-hooks
lisp-float-type elisp-mode mwheel term/ns-win ns-win ucs-normalize
mule-util term/common-win touch-screen tool-bar dnd fontset image
regexp-opt fringe tabulated-list replace newcomment text-mode lisp-mode
prog-mode register page tab-bar menu-bar rfn-eshadow isearch easymenu
timer select scroll-bar mouse jit-lock font-lock syntax font-core
term/tty-colors frame minibuffer nadvice seq simple cl-generic
indonesian philippine cham georgian utf-8-lang misc-lang vietnamese
tibetan thai tai-viet lao korean japanese eucjp-ms cp51932 hebrew greek
romanian slovak czech european ethiopic indian cyrillic chinese
composite emoji-zwj charscript charprop case-table epa-hook
jka-cmpr-hook help abbrev obarray oclosure cl-preloaded button loaddefs
theme-loaddefs faces cus-face macroexp files window text-properties
overlay sha1 md5 base64 format env code-pages mule custom widget keymap
hashtable-print-readable backquote threads kqueue cocoa ns lcms2
multi-tty make-network-process native-compile emacs)

Memory information:
((conses 16 1715062 1710222) (symbols 48 59369 9) (strings 32 463445 162848)
 (string-bytes 1 12748013) (vectors 16 187678) (vector-slots 8 3436760 1120751)
 (floats 8 1816 4805) (intervals 56 40244 7368) (buffers 992 34))




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#67991; Package emacs. (Sat, 23 Dec 2023 15:11:01 GMT) Full text and rfc822 format available.

Message #8 received at 67991 <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: Aaron Jensen <aaronjensen <at> gmail.com>
Cc: monnier <at> iro.umontreal.ca, 67991 <at> debbugs.gnu.org
Subject: Re: bug#67991: 30.0.50;
 boundp always returns nil in format-mode-line with let* after 0fde935
Date: Sat, 23 Dec 2023 17:09:40 +0200
> Cc: monnier <at> iro.umontreal.ca
> From: Aaron Jensen <aaronjensen <at> gmail.com>
> Date: Sat, 23 Dec 2023 09:51:50 -0500
> 
> 
> After commits:
> 
> 0fde935b66e43e4d7ec137ba6195de993168587a
> a63b206fbde2ead91f1053d80a275f8850e5ffce
> 
> boundp returns nil here, rather than t, like it used to:
> 
> (format-mode-line
>  '(:eval (let* ((some-var "some-value")
>                 (_ (message "Bound: %S" (boundp 'some-var))))
>            (message "Var: %S, Bound: %S" some-var (boundp 'some-var)))))

If I evaluate this:

  (let* ((some-var "some-value")
		  (_ (message "Bound: %S" (boundp 'some-var))))
	     (message "Var: %S, Bound: %S" some-var (boundp 'some-var)))

in *scratch*, I also get nil and nil, both in Emacs 29 and with the
latest master branch.  So why would you expect to see t when you
evaluate this as part of format-mode-line?  Or what am I missing?




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#67991; Package emacs. (Sat, 23 Dec 2023 15:22:01 GMT) Full text and rfc822 format available.

Message #11 received at 67991 <at> debbugs.gnu.org (full text, mbox):

From: Gerd Möllmann <gerd.moellmann <at> gmail.com>
To: Aaron Jensen <aaronjensen <at> gmail.com>
Cc: monnier <at> iro.umontreal.ca, 67991 <at> debbugs.gnu.org
Subject: Re: bug#67991: 30.0.50; boundp always returns nil in
 format-mode-line with let* after 0fde935
Date: Sat, 23 Dec 2023 16:21:44 +0100
Aaron Jensen <aaronjensen <at> gmail.com> writes:

> After commits:
>
> 0fde935b66e43e4d7ec137ba6195de993168587a
> a63b206fbde2ead91f1053d80a275f8850e5ffce
>
> boundp returns nil here, rather than t, like it used to:
>
> (format-mode-line
>  '(:eval (let* ((some-var "some-value")
>                 (_ (message "Bound: %S" (boundp 'some-var))))
>            (message "Var: %S, Bound: %S" some-var (boundp 'some-var)))))
>
> This has an impact on a particular package I use for my modeline, which
> can be worked around if this behavior is expected. It seemed a
> significant chagne, so I wanted to report it, in case it was not expected.

I don't know why that would have changed things with Stefan's commit,
but are your sure that some-var is declared special (has a defvar, for
instance)? When it is, boundp returns t here.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#67991; Package emacs. (Sat, 23 Dec 2023 15:53:01 GMT) Full text and rfc822 format available.

Message #14 received at 67991 <at> debbugs.gnu.org (full text, mbox):

From: Aaron Jensen <aaronjensen <at> gmail.com>
To: Gerd Möllmann <gerd.moellmann <at> gmail.com>
Cc: monnier <at> iro.umontreal.ca, 67991 <at> debbugs.gnu.org
Subject: Re: bug#67991: 30.0.50; boundp always returns nil in format-mode-line
 with let* after 0fde935
Date: Sat, 23 Dec 2023 10:52:22 -0500
On Sat, Dec 23, 2023 at 10:21 AM Gerd Möllmann <gerd.moellmann <at> gmail.com> wrote:
>
> Aaron Jensen <aaronjensen <at> gmail.com> writes:
>
> > After commits:
> >
> > 0fde935b66e43e4d7ec137ba6195de993168587a
> > a63b206fbde2ead91f1053d80a275f8850e5ffce
> >
> > boundp returns nil here, rather than t, like it used to:
> >
> > (format-mode-line
> >  '(:eval (let* ((some-var "some-value")
> >                 (_ (message "Bound: %S" (boundp 'some-var))))
> >            (message "Var: %S, Bound: %S" some-var (boundp 'some-var)))))
> >
> > This has an impact on a particular package I use for my modeline, which
> > can be worked around if this behavior is expected. It seemed a
> > significant chagne, so I wanted to report it, in case it was not expected.
>
> I don't know why that would have changed things with Stefan's commit,
> but are your sure that some-var is declared special (has a defvar, for
> instance)? When it is, boundp returns t here.

It's not in the package in question. But even if I defvar w/o giving
it a value, it does not return t:

(defvar some-var)

(let* ((some-var "some-value")
                (_ (message "Bound: %S" (boundp 'some-var))))
           (message "Var: %S, Bound: %S" some-var (boundp 'some-var)))

(format-mode-line
 '(:eval (let* ((some-var "some-value")
                (_ (message "Bound: %S" (boundp 'some-var))))
           (message "Var: %S, Bound: %S" some-var (boundp 'some-var)))))

The first returns t, the second does not.

As to your question, Eli, I don't know. If it shouldn't return nil
then I can report that downstream and they can fix it there.

Aaron




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#67991; Package emacs. (Sat, 23 Dec 2023 16:14:02 GMT) Full text and rfc822 format available.

Message #17 received at 67991 <at> debbugs.gnu.org (full text, mbox):

From: Gerd Möllmann <gerd.moellmann <at> gmail.com>
To: Aaron Jensen <aaronjensen <at> gmail.com>
Cc: monnier <at> iro.umontreal.ca, 67991 <at> debbugs.gnu.org
Subject: Re: bug#67991: 30.0.50; boundp always returns nil in
 format-mode-line with let* after 0fde935
Date: Sat, 23 Dec 2023 17:13:18 +0100
Aaron Jensen <aaronjensen <at> gmail.com> writes:

> On Sat, Dec 23, 2023 at 10:21 AM Gerd Möllmann <gerd.moellmann <at> gmail.com> wrote:
>>
>> Aaron Jensen <aaronjensen <at> gmail.com> writes:
>>
>> > After commits:
>> >
>> > 0fde935b66e43e4d7ec137ba6195de993168587a
>> > a63b206fbde2ead91f1053d80a275f8850e5ffce
>> >
>> > boundp returns nil here, rather than t, like it used to:
>> >
>> > (format-mode-line
>> >  '(:eval (let* ((some-var "some-value")
>> >                 (_ (message "Bound: %S" (boundp 'some-var))))
>> >            (message "Var: %S, Bound: %S" some-var (boundp 'some-var)))))
>> >
>> > This has an impact on a particular package I use for my modeline, which
>> > can be worked around if this behavior is expected. It seemed a
>> > significant chagne, so I wanted to report it, in case it was not expected.
>>
>> I don't know why that would have changed things with Stefan's commit,
>> but are your sure that some-var is declared special (has a defvar, for
>> instance)? When it is, boundp returns t here.
>
> It's not in the package in question.

It should have a defvar, to make sure that the binding of some-var in
the let* behaves as expected also when lexical-binding it t, which it is
in lisp-interaction-mode, for example.

> But even if I defvar w/o giving
> it a value, it does not return t:

That's strange, indeed:

(defvar some-var2)
 => some-var2
(special-variable-p 'some-var2)
 => nil

(defvar some-var3 nil)
 => some-var3
(special-variable-p 'some-var3)
 => t

Does someone know if that's intended for some reason?

Looks like a bug to me.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#67991; Package emacs. (Sat, 23 Dec 2023 16:43:01 GMT) Full text and rfc822 format available.

Message #20 received at 67991 <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: Aaron Jensen <aaronjensen <at> gmail.com>
Cc: gerd.moellmann <at> gmail.com, monnier <at> iro.umontreal.ca, 67991 <at> debbugs.gnu.org
Subject: Re: bug#67991: 30.0.50;
 boundp always returns nil in format-mode-line with let* after 0fde935
Date: Sat, 23 Dec 2023 18:42:26 +0200
> Cc: monnier <at> iro.umontreal.ca, 67991 <at> debbugs.gnu.org
> From: Aaron Jensen <aaronjensen <at> gmail.com>
> Date: Sat, 23 Dec 2023 10:52:22 -0500
> 
> On Sat, Dec 23, 2023 at 10:21 AM Gerd Möllmann <gerd.moellmann <at> gmail.com> wrote:
> >
> > Aaron Jensen <aaronjensen <at> gmail.com> writes:
> >
> > > After commits:
> > >
> > > 0fde935b66e43e4d7ec137ba6195de993168587a
> > > a63b206fbde2ead91f1053d80a275f8850e5ffce
> > >
> > > boundp returns nil here, rather than t, like it used to:
> > >
> > > (format-mode-line
> > >  '(:eval (let* ((some-var "some-value")
> > >                 (_ (message "Bound: %S" (boundp 'some-var))))
> > >            (message "Var: %S, Bound: %S" some-var (boundp 'some-var)))))
> > >
> > > This has an impact on a particular package I use for my modeline, which
> > > can be worked around if this behavior is expected. It seemed a
> > > significant chagne, so I wanted to report it, in case it was not expected.
> >
> > I don't know why that would have changed things with Stefan's commit,
> > but are your sure that some-var is declared special (has a defvar, for
> > instance)? When it is, boundp returns t here.
> 
> It's not in the package in question. But even if I defvar w/o giving
> it a value, it does not return t:
> 
> (defvar some-var)
> 
> (let* ((some-var "some-value")
>                 (_ (message "Bound: %S" (boundp 'some-var))))
>            (message "Var: %S, Bound: %S" some-var (boundp 'some-var)))
> 
> (format-mode-line
>  '(:eval (let* ((some-var "some-value")
>                 (_ (message "Bound: %S" (boundp 'some-var))))
>            (message "Var: %S, Bound: %S" some-var (boundp 'some-var)))))
> 
> The first returns t, the second does not.

This one will return t:

  (format-mode-line
   '(:eval (progn
	     (defvar some-var)
	     (let* ((some-var "some-value")
		    (_ (message "Bound: %S" (boundp 'some-var))))
	       (message "Var: %S, Bound: %S" some-var (boundp 'some-var))))))

> As to your question, Eli, I don't know. If it shouldn't return nil
> then I can report that downstream and they can fix it there.

Let's wait for Stefan to chime in, he made the change you blamed.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#67991; Package emacs. (Sun, 24 Dec 2023 07:14:01 GMT) Full text and rfc822 format available.

Message #23 received at 67991 <at> debbugs.gnu.org (full text, mbox):

From: Gerd Möllmann <gerd.moellmann <at> gmail.com>
To: Eli Zaretskii <eliz <at> gnu.org>
Cc: monnier <at> iro.umontreal.ca, Aaron Jensen <aaronjensen <at> gmail.com>,
 67991 <at> debbugs.gnu.org
Subject: Re: bug#67991: 30.0.50; boundp always returns nil in
 format-mode-line with let* after 0fde935
Date: Sun, 24 Dec 2023 08:13:39 +0100
Eli Zaretskii <eliz <at> gnu.org> writes:

> This one will return t:
>
>   (format-mode-line
>    '(:eval (progn
> 	     (defvar some-var)
> 	     (let* ((some-var "some-value")
> 		    (_ (message "Bound: %S" (boundp 'some-var))))
> 	       (message "Var: %S, Bound: %S" some-var (boundp 'some-var))))))
>

Indeed. Looking at Fdefvar, one can see that a "(defvar foo)" does this
when lexical-binding is t

    /* A simple (defvar foo) with lexical scoping does "nothing" except
       declare that var to be dynamically scoped *locally* (i.e. within
       the current file or let-block).  */

while it does nothing at all if lexical-binding is nil. Maybe defvar's
doc string could give some hint to that. This sentence at least is not
true for "(defvar SYMBOL)":

        The ‘defvar’ form also declares the variable as "special",
so that it is always dynamically bound even if ‘lexical-binding’ is t.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#67991; Package emacs. (Sun, 24 Dec 2023 07:47:01 GMT) Full text and rfc822 format available.

Message #26 received at 67991 <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: Gerd Möllmann <gerd.moellmann <at> gmail.com>
Cc: monnier <at> iro.umontreal.ca, aaronjensen <at> gmail.com, 67991 <at> debbugs.gnu.org
Subject: Re: bug#67991: 30.0.50; boundp always returns nil in
 format-mode-line with let* after 0fde935
Date: Sun, 24 Dec 2023 09:45:41 +0200
> From: Gerd Möllmann <gerd.moellmann <at> gmail.com>
> Cc: Aaron Jensen <aaronjensen <at> gmail.com>,  monnier <at> iro.umontreal.ca,
>   67991 <at> debbugs.gnu.org
> Date: Sun, 24 Dec 2023 08:13:39 +0100
> 
> Eli Zaretskii <eliz <at> gnu.org> writes:
> 
> > This one will return t:
> >
> >   (format-mode-line
> >    '(:eval (progn
> > 	     (defvar some-var)
> > 	     (let* ((some-var "some-value")
> > 		    (_ (message "Bound: %S" (boundp 'some-var))))
> > 	       (message "Var: %S, Bound: %S" some-var (boundp 'some-var))))))
> >
> 
> Indeed. Looking at Fdefvar, one can see that a "(defvar foo)" does this
> when lexical-binding is t
> 
>     /* A simple (defvar foo) with lexical scoping does "nothing" except
>        declare that var to be dynamically scoped *locally* (i.e. within
>        the current file or let-block).  */
> 
> while it does nothing at all if lexical-binding is nil. Maybe defvar's
> doc string could give some hint to that. This sentence at least is not
> true for "(defvar SYMBOL)":
> 
>         The ‘defvar’ form also declares the variable as "special",
> so that it is always dynamically bound even if ‘lexical-binding’ is t.

Thanks, I hope I clarified the doc string now.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#67991; Package emacs. (Sun, 24 Dec 2023 08:06:02 GMT) Full text and rfc822 format available.

Message #29 received at 67991 <at> debbugs.gnu.org (full text, mbox):

From: Gerd Möllmann <gerd.moellmann <at> gmail.com>
To: Eli Zaretskii <eliz <at> gnu.org>
Cc: monnier <at> iro.umontreal.ca, aaronjensen <at> gmail.com, 67991 <at> debbugs.gnu.org
Subject: Re: bug#67991: 30.0.50; boundp always returns nil in
 format-mode-line with let* after 0fde935
Date: Sun, 24 Dec 2023 09:05:38 +0100
Eli Zaretskii <eliz <at> gnu.org> writes:

> Thanks, I hope I clarified the doc string now.

LGTM. Thanks!




This bug report was last modified 1 year and 174 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.