bug#81564: Possible bug when binding dynamically with an existing lexical binding
Thuna <[email protected]> Thu, 06 Aug 2026 02:23:40 +0200
| Newsgroups | gmane.emacs.bugs |
|---|---|
| Message-ID | <[email protected]> |
The code (let ((x 2)) (defvar x) (let ((x 10)) x)) returns 2, which seems extremely unintuitive to me, if not an outright bug. The unintuitive thing is that the `defvar' effects not the first binding but the second binding, but if that is simply how it works then I don't have anything to say about it. The possible bug is that the `x' that returns is referring to the lexical `x' bound in the outer `let', instead of referring to the dynamic `x' bound in the inner `let'. I think what is happening is that when `x' reaches `eval_sub', it looks for the lexical value first, assuming that it wouldn't have a lexical value if it was marked dynamic, not taking into account the situation where it was marked dynamic only locally with a lexical binding around. I am unsure if this is a bug or simply an illegal way to use `defvar'.