* defvar inside let-binding (was: bug#9090: 24.0.50; void-variable jka-compr-verbose)
[not found] ` <m3hb6nct3e.fsf@quimbies.gnus.org>
@ 2011-07-18 14:03 ` Stefan Monnier
2011-07-18 14:20 ` defvar inside let-binding Lars Magne Ingebrigtsen
0 siblings, 1 reply; 9+ messages in thread
From: Stefan Monnier @ 2011-07-18 14:03 UTC (permalink / raw)
To: emacs-devel
>>> When starting emacs, I'm getting a warning "Warning: defvar ignored
>>> because jka-compr-verbose is let-bound".
>> Fixed.
> Sorry; my fault. The binding/later-loading thing is pretty annoying in
> general, though.
Yes.
> Has changing the way `defvar' works in the presence of let-bindings been
> discussed?
No. Personally I can't see how to make it work, because by the time we
get to defvar it's kind of too late. Maybe we could try to change the
let-binding so that the "saved void state" (which will be restored at
the end of the outer let) gets changed as if the var had been defvarred
before the let-binding. But it sounds terribly hackish.
Of course, another problem is that in the case of defcustom we don't
even detect the problem.
Stefan
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: defvar inside let-binding
2011-07-18 14:03 ` defvar inside let-binding (was: bug#9090: 24.0.50; void-variable jka-compr-verbose) Stefan Monnier
@ 2011-07-18 14:20 ` Lars Magne Ingebrigtsen
2011-07-18 16:18 ` Stefan Monnier
0 siblings, 1 reply; 9+ messages in thread
From: Lars Magne Ingebrigtsen @ 2011-07-18 14:20 UTC (permalink / raw)
To: emacs-devel
Stefan Monnier <monnier@iro.umontreal.ca> writes:
>> Has changing the way `defvar' works in the presence of let-bindings been
>> discussed?
>
> No. Personally I can't see how to make it work, because by the time we
> get to defvar it's kind of too late. Maybe we could try to change the
> let-binding so that the "saved void state" (which will be restored at
> the end of the outer let) gets changed as if the var had been defvarred
> before the let-binding. But it sounds terribly hackish.
That was exactly what I was thinking should happen. :-)
I mean, if you say
(let ((foo-var nil))
(foo-function))
and `foo-function' is autoloaded -- I can't think of a single use case
where you'd want `foo-var' to be unbound afterwards.
That `foo-function' is autoloaded or a real function is something that
should (in my opinion) have no effect on what you'd end up with after
calling it.
Leaving `foo-var' unbound is what is the hack, I think. We should
strive to end up with the same result after calling `foo-function', no
matter whether it's autoloaded or not.
> Of course, another problem is that in the case of defcustom we don't
> even detect the problem.
I'm not sure I follow you there...
--
(domestic pets only, the antidote for overdose, milk.)
bloggy blog http://lars.ingebrigtsen.no/
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: defvar inside let-binding
2011-07-18 14:20 ` defvar inside let-binding Lars Magne Ingebrigtsen
@ 2011-07-18 16:18 ` Stefan Monnier
2011-07-19 16:14 ` Lars Magne Ingebrigtsen
0 siblings, 1 reply; 9+ messages in thread
From: Stefan Monnier @ 2011-07-18 16:18 UTC (permalink / raw)
To: emacs-devel
>> Of course, another problem is that in the case of defcustom we don't
>> even detect the problem.
> I'm not sure I follow you there...
defcustom works differently from defvar and doesn't use defvar
(e.g. because it may not even define a real variable: the "var" may
simply only be available through accessor/setter functions) and since
the current code that detects a "defvar within let" is written in C code
in Fdefvar, it doesn't apply to defcustom.
Stefan
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: defvar inside let-binding
2011-07-18 16:18 ` Stefan Monnier
@ 2011-07-19 16:14 ` Lars Magne Ingebrigtsen
2011-08-01 21:20 ` Stefan Monnier
0 siblings, 1 reply; 9+ messages in thread
From: Lars Magne Ingebrigtsen @ 2011-07-19 16:14 UTC (permalink / raw)
To: emacs-devel
Stefan Monnier <monnier@iro.umontreal.ca> writes:
> defcustom works differently from defvar and doesn't use defvar
> (e.g. because it may not even define a real variable: the "var" may
> simply only be available through accessor/setter functions) and since
> the current code that detects a "defvar within let" is written in C code
> in Fdefvar, it doesn't apply to defcustom.
Right.
But does
(let ((foo nil))
(foo-function))
leave `foo' unbound if `foo' is a defcustom?
--
(domestic pets only, the antidote for overdose, milk.)
bloggy blog http://lars.ingebrigtsen.no/
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: defvar inside let-binding
2011-07-19 16:14 ` Lars Magne Ingebrigtsen
@ 2011-08-01 21:20 ` Stefan Monnier
2011-08-02 13:42 ` Lars Magne Ingebrigtsen
0 siblings, 1 reply; 9+ messages in thread
From: Stefan Monnier @ 2011-08-01 21:20 UTC (permalink / raw)
To: emacs-devel
> But does
> (let ((foo nil))
> (foo-function))
> leave `foo' unbound if `foo' is a defcustom?
Yes, just like with defvar. The difference is that defvar detects the
problem and outputs a warning.
Stefan
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: defvar inside let-binding
2011-08-01 21:20 ` Stefan Monnier
@ 2011-08-02 13:42 ` Lars Magne Ingebrigtsen
2011-08-02 19:22 ` Stefan Monnier
0 siblings, 1 reply; 9+ messages in thread
From: Lars Magne Ingebrigtsen @ 2011-08-02 13:42 UTC (permalink / raw)
To: emacs-devel
Stefan Monnier <monnier@iro.umontreal.ca> writes:
> Yes, just like with defvar. The difference is that defvar detects the
> problem and outputs a warning.
Ah, ok. So if we decide to change the way let-bindings affect defvar
when we load files, then we have to basically implement the same
detection for defcustom.
Which we probably should do anyway. :-)
It's this code, right?
if (NILP (tem))
Fset_default (sym, eval_sub (Fcar (tail)));
else
{ /* Check if there is really a global binding rather than just a let
binding that shadows the global unboundness of the var. */
volatile struct specbinding *pdl = specpdl_ptr;
while (--pdl >= specpdl)
{
if (EQ (pdl->symbol, sym) && !pdl->func
&& EQ (pdl->old_value, Qunbound))
{
message_with_string ("Warning: defvar ignored because %s is let-bound",
SYMBOL_NAME (sym), 1);
break;
}
}
}
Since `defcustom' seems to be purely Emacs Lisp, and I don't think this
data is available on the Emacs Lisp level (am I wrong?), perhaps just
creating a C-level function `symbol-let-bound-p' (or something) would
allow us to issue the warning, as a first step?
--
(domestic pets only, the antidote for overdose, milk.)
bloggy blog http://lars.ingebrigtsen.no/
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: defvar inside let-binding
2011-08-02 13:42 ` Lars Magne Ingebrigtsen
@ 2011-08-02 19:22 ` Stefan Monnier
2011-08-02 19:56 ` Lars Magne Ingebrigtsen
0 siblings, 1 reply; 9+ messages in thread
From: Stefan Monnier @ 2011-08-02 19:22 UTC (permalink / raw)
To: emacs-devel
> Since `defcustom' seems to be purely Emacs Lisp, and I don't think this
> data is available on the Emacs Lisp level (am I wrong?), perhaps just
> creating a C-level function `symbol-let-bound-p' (or something) would
> allow us to issue the warning, as a first step?
Yes. Tho the "next" step you suggested (to cause defvar to change the
outer let-binding) will require another such function and will make
symbol-let-bound-p unneeded.
Stefan
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: defvar inside let-binding
2011-08-02 19:22 ` Stefan Monnier
@ 2011-08-02 19:56 ` Lars Magne Ingebrigtsen
2011-08-02 20:47 ` Stefan Monnier
0 siblings, 1 reply; 9+ messages in thread
From: Lars Magne Ingebrigtsen @ 2011-08-02 19:56 UTC (permalink / raw)
To: Stefan Monnier; +Cc: emacs-devel
Stefan Monnier <monnier@iro.umontreal.ca> writes:
> Yes. Tho the "next" step you suggested (to cause defvar to change the
> outer let-binding) will require another such function and will make
> symbol-let-bound-p unneeded.
Let's see...
;; Use defvar to set the docstring as well as the special-variable-p flag.
;; FIXME: We should reproduce more of `defvar's behavior, such as the warning
;; when the var is currently let-bound.
(if (not (default-boundp symbol))
;; Don't use defvar to avoid setting a default-value when undesired.
(when doc (put symbol 'variable-documentation doc))
(eval `(defvar ,symbol nil ,@(when doc (list doc)))))
So what I would do here now would be to add
(when (symbol-let-bound-p symbol)
(message "Warning: let-bound etc"))
now, and in Emacs 24.2, I'd change that to
(when (symbol-let-bound-p symbol)
(change-outer-let-binding symbol default))
Or something along those lines?
--
(domestic pets only, the antidote for overdose, milk.)
bloggy blog http://lars.ingebrigtsen.no/
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: defvar inside let-binding
2011-08-02 19:56 ` Lars Magne Ingebrigtsen
@ 2011-08-02 20:47 ` Stefan Monnier
0 siblings, 0 replies; 9+ messages in thread
From: Stefan Monnier @ 2011-08-02 20:47 UTC (permalink / raw)
To: Lars Magne Ingebrigtsen; +Cc: emacs-devel
>> Yes. Tho the "next" step you suggested (to cause defvar to change the
>> outer let-binding) will require another such function and will make
>> symbol-let-bound-p unneeded.
> Let's see...
> ;; Use defvar to set the docstring as well as the special-variable-p flag.
> ;; FIXME: We should reproduce more of `defvar's behavior, such as the warning
> ;; when the var is currently let-bound.
> (if (not (default-boundp symbol))
> ;; Don't use defvar to avoid setting a default-value when undesired.
> (when doc (put symbol 'variable-documentation doc))
> (eval `(defvar ,symbol nil ,@(when doc (list doc)))))
> So what I would do here now would be to add
> (when (symbol-let-bound-p symbol)
> (message "Warning: let-bound etc"))
> now, and in Emacs 24.2, I'd change that to
> (when (symbol-let-bound-p symbol)
> (change-outer-let-binding symbol default))
> Or something along those lines?
Yes, although the above code is run after the var has been set,
i.e. too late.
Stefan
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2011-08-02 20:47 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <87sjq7pq14.fsf@yun.yagibdah.de>
[not found] ` <1ztyanqxv5.fsf@fencepost.gnu.org>
[not found] ` <m3hb6nct3e.fsf@quimbies.gnus.org>
2011-07-18 14:03 ` defvar inside let-binding (was: bug#9090: 24.0.50; void-variable jka-compr-verbose) Stefan Monnier
2011-07-18 14:20 ` defvar inside let-binding Lars Magne Ingebrigtsen
2011-07-18 16:18 ` Stefan Monnier
2011-07-19 16:14 ` Lars Magne Ingebrigtsen
2011-08-01 21:20 ` Stefan Monnier
2011-08-02 13:42 ` Lars Magne Ingebrigtsen
2011-08-02 19:22 ` Stefan Monnier
2011-08-02 19:56 ` Lars Magne Ingebrigtsen
2011-08-02 20:47 ` Stefan Monnier
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).