* bug#4755: 23.1; case where `C-M-x' on defcustom doesn't seem to work
@ 2009-10-19 0:21 Drew Adams
2016-07-05 4:14 ` npostavs
0 siblings, 1 reply; 8+ messages in thread
From: Drew Adams @ 2009-10-19 0:21 UTC (permalink / raw)
To: bug-gnu-emacs
emacs -Q
(defcustom foo '(("foo" (f1 f2) f3) ("bar" (b1 b2) b3))
"..."
:type '(repeat
(cons
(choice :tag "a" string symbol)
(choice
(const :tag "b" nil)
(function :tag "c")
(list :tag "d"
(repeat (function :tag "e"))
(choice
(const :tag "f" nil)
(function :tag "g")))))))
(defcustom toto (copy-sequence foo)
"..."
:type '(repeat
(cons
(choice :tag "r" string symbol)
(choice
(const :tag "s" nil)
(function :tag "t")
(list :tag "u"
(repeat (function :tag "v"))
(choice
(const :tag "w" nil)
(function :tag "x")))))))
(defun f1 ())
(defun f2 ())
(defun f3 ())
(defun b1 ())
(defun b2 ())
(defun b3 ())
Then M-x customize-option foo
Insert another alist element, then set the value for the session, so
foo's value now has 3 alist elements. Option toto's value is like
foo's, but it is missing the first alist element (the new one).
Put point on toto's defcustom and do `C-M-x'. The value is not updated
to be a copy of foo's current value. The value looks like it hasn't
changed.
AFAIK, there are no side effects going on here. And if you explicitly
do (setq toto (copy-sequence foo)), then it of course does get updated
to reflect the latest foo value.
Seems like a bug. There's no doubt a simpler test case, but I have this
ready-to-hand and don't feel like paring it down.
In GNU Emacs 23.1.1 (i386-mingw-nt5.1.2600)
of 2009-07-29 on SOFT-MJASON
Windowing system distributor `Microsoft Corp.', version 5.1.2600
configured using `configure --with-gcc (4.4)'
^ permalink raw reply [flat|nested] 8+ messages in thread
* bug#4755: 23.1; case where `C-M-x' on defcustom doesn't seem to work
2009-10-19 0:21 bug#4755: 23.1; case where `C-M-x' on defcustom doesn't seem to work Drew Adams
@ 2016-07-05 4:14 ` npostavs
2016-07-05 14:30 ` Drew Adams
0 siblings, 1 reply; 8+ messages in thread
From: npostavs @ 2016-07-05 4:14 UTC (permalink / raw)
To: Drew Adams; +Cc: 4755
tags 4755 unreproducible
quit
"Drew Adams" <drew.adams@oracle.com> writes:
> emacs -Q
>
> (defcustom foo '(("foo" (f1 f2) f3) ("bar" (b1 b2) b3))
> "..."
> :type '(repeat
> (cons
> (choice :tag "a" string symbol)
> (choice
> (const :tag "b" nil)
> (function :tag "c")
> (list :tag "d"
> (repeat (function :tag "e"))
> (choice
> (const :tag "f" nil)
> (function :tag "g")))))))
>
> (defcustom toto (copy-sequence foo)
> "..."
> :type '(repeat
> (cons
> (choice :tag "r" string symbol)
> (choice
> (const :tag "s" nil)
> (function :tag "t")
> (list :tag "u"
> (repeat (function :tag "v"))
> (choice
> (const :tag "w" nil)
> (function :tag "x")))))))
>
> (defun f1 ())
> (defun f2 ())
> (defun f3 ())
>
> (defun b1 ())
> (defun b2 ())
> (defun b3 ())
>
> Then M-x customize-option foo
>
> Insert another alist element, then set the value for the session, so
> foo's value now has 3 alist elements. Option toto's value is like
> foo's, but it is missing the first alist element (the new one).
>
> Put point on toto's defcustom and do `C-M-x'. The value is not updated
> to be a copy of foo's current value. The value looks like it hasn't
> changed.
>
> AFAIK, there are no side effects going on here. And if you explicitly
> do (setq toto (copy-sequence foo)), then it of course does get updated
> to reflect the latest foo value.
>
> Seems like a bug. There's no doubt a simpler test case, but I have this
> ready-to-hand and don't feel like paring it down.
>
>
>
> In GNU Emacs 23.1.1 (i386-mingw-nt5.1.2600)
> of 2009-07-29 on SOFT-MJASON
> Windowing system distributor `Microsoft Corp.', version 5.1.2600
> configured using `configure --with-gcc (4.4)'
>
Can't reproduce on Emacs 23.4, perhaps it was fixed?
^ permalink raw reply [flat|nested] 8+ messages in thread
* bug#4755: 23.1; case where `C-M-x' on defcustom doesn't seem to work
2016-07-05 4:14 ` npostavs
@ 2016-07-05 14:30 ` Drew Adams
2016-07-05 17:00 ` Noam Postavsky
0 siblings, 1 reply; 8+ messages in thread
From: Drew Adams @ 2016-07-05 14:30 UTC (permalink / raw)
To: npostavs; +Cc: 4755
> tags 4755 unreproducible
> quit
> Can't reproduce on Emacs 23.4, perhaps it was fixed?
I just reproduced it using Emacs 25, from emacs -Q. Here's
some of the proof of a problem:
toto's value is shown below.
Documentation:
...
You can customize this variable.
Value: (("foo" (f1 f2) f3) ("bar" (b1 b2) b3))
Original value was
(("foo"
(f1 f2)
f3)
("bar"
(b1 b2)
b3)
("toto"
(f1 f2 f3)
nil))
`foo', not `toto' was customized, and the Value shown
here is correct. But the "Original value" is incorrect.
The "Original value" shown is the new, current value
of `foo'. `toto' never had, as still does not have,
that "Original value".
For the above, I did not even get to the part of the
recipe that calls for using `C-M-x' on the `toto'
defcustom. All I did was customize `foo' and set it
for the session.
Then, doing `C-M-x' does correctly show `toto' as
having the same value as `foo'.
So if you prefer, yes, the bug as reported seems to be
fixed. But there is another bug, shown above:
customizing `foo' changes the "Original value" part
of the output of `C-h v' for `toto'.
Something is still amiss in the state of Denmark...
^ permalink raw reply [flat|nested] 8+ messages in thread
* bug#4755: 23.1; case where `C-M-x' on defcustom doesn't seem to work
2016-07-05 14:30 ` Drew Adams
@ 2016-07-05 17:00 ` Noam Postavsky
2016-07-05 17:30 ` Drew Adams
0 siblings, 1 reply; 8+ messages in thread
From: Noam Postavsky @ 2016-07-05 17:00 UTC (permalink / raw)
To: Drew Adams; +Cc: 4755
On Tue, Jul 5, 2016 at 10:30 AM, Drew Adams <drew.adams@oracle.com> wrote:
> `foo', not `toto' was customized, and the Value shown
> here is correct. But the "Original value" is incorrect.
> The "Original value" shown is the new, current value
> of `foo'. `toto' never had, as still does not have,
> that "Original value".
Ah, but this appears to be expected behaviour:
(defcustom SYMBOL STANDARD DOC &rest ARGS)
[...]
STANDARD is an expression specifying the variable's standard
value. It should not be quoted. It is evaluated once by
`defcustom', and the value is assigned to SYMBOL if the variable
is unbound. The expression itself is also stored, so that
Customize can re-evaluate it later to get the standard value.
DOC is the variable documentation.
Compare what happens with:
(defcustom time (current-time)
"the time"
:type '(list integer))
So perhaps the thing to be fixed is that describe-variable should say
"Standard value" rather than "Original value".
^ permalink raw reply [flat|nested] 8+ messages in thread
* bug#4755: 23.1; case where `C-M-x' on defcustom doesn't seem to work
2016-07-05 17:00 ` Noam Postavsky
@ 2016-07-05 17:30 ` Drew Adams
2016-07-05 17:56 ` Noam Postavsky
0 siblings, 1 reply; 8+ messages in thread
From: Drew Adams @ 2016-07-05 17:30 UTC (permalink / raw)
To: Noam Postavsky; +Cc: 4755
> > `foo', not `toto' was customized, and the Value shown
> > here is correct. But the "Original value" is incorrect.
> > The "Original value" shown is the new, current value
> > of `foo'. `toto' never had, as still does not have,
> > that "Original value".
>
> Ah, but this appears to be expected behaviour:
>
> (defcustom SYMBOL STANDARD DOC &rest ARGS)
>
> [...]
> STANDARD is an expression specifying the variable's standard
> value. It should not be quoted. It is evaluated once by
> `defcustom', and the value is assigned to SYMBOL if the variable
> is unbound. The expression itself is also stored, so that
> Customize can re-evaluate it later to get the standard value.
> DOC is the variable documentation.
>
> Compare what happens with:
>
> (defcustom time (current-time)
> "the time"
> :type '(list integer))
I don't see why any of that indicates that what I described
is "expected". But it does seem to confirm that there are
problems.
The "original value" should not change, and especially not just
by using `C-h v'. It is wrong to say the "original value was"
something that it never was and still is not! I don't see any
evidence that that behavior is "expected" or is by design.
> So perhaps the thing to be fixed is that describe-variable
> should say "Standard value" rather than "Original value".
I don't see how that would help.
The doc you quote says that the std value is recomputed
_by Customize_, by reevaluating the saved expression.
Why should that affect `C-h v'?
Also, `M-x customize-option time' shows this, which seems
wrong. Seems like `C-h v' is taken as changing the value
outside customize?
State : CHANGED outside Customize. (mismatch)
I have not reevaluated the defcustom at all. All I did
was evaluate it once and then use `C-h v time' a few times.
Anyway, there is a type mismatch. You should have used
:type '(list integer integer integer integer).
But even so, it does not seem right that a type mismatch
should mess things up so much.
For example, the State menu shows the item `Show Saved
Lisp Expression' _disabled_. And it shows item `Revert
This Session's Customization', even though I have done no
customization. And if I choose `Revert...' there is no
change in the menu.
I'm guessing that these problems arise because there is
a type mismatch. But they still shouldn't manifest this
way, I think.
Seems buggy. I did this with emacs -Q, with this Emacs 25
build:
In GNU Emacs 25.1.50.1 (i686-pc-mingw32)
of 2015-12-10
Repository revision: 6148555ee5a3d0139ae517803718b3e0357933c7
Windowing system distributor 'Microsoft Corp.', version 6.1.7601
Configured using:
'configure --prefix=/c/Devel/emacs/snapshot/trunk --enable-checking=yes
--enable-check-lisp-object-type --without-compress-install 'CFLAGS=-Og
-ggdb3' LDFLAGS=-Lc:/Devel/emacs/lib 'CPPFLAGS=-DGC_MCHECK=1
-Ic:/Devel/emacs/include''
Seems like we've stumbled on more than one bug here?
Correcting the :type and trying again, with a new variable
named `atime', I still see the State as CHANGED outside Customize.
And again, that's just by evaluating the defcustom once and
doing `C-h v' a couple times.
^ permalink raw reply [flat|nested] 8+ messages in thread
* bug#4755: 23.1; case where `C-M-x' on defcustom doesn't seem to work
2016-07-05 17:30 ` Drew Adams
@ 2016-07-05 17:56 ` Noam Postavsky
2016-07-05 18:20 ` Drew Adams
0 siblings, 1 reply; 8+ messages in thread
From: Noam Postavsky @ 2016-07-05 17:56 UTC (permalink / raw)
To: Drew Adams; +Cc: 4755
On Tue, Jul 5, 2016 at 1:30 PM, Drew Adams <drew.adams@oracle.com> wrote:
> The "original value" should not change, and especially not just
> by using `C-h v'. It is wrong to say the "original value was"
> something that it never was and still is not! I don't see any
> evidence that that behavior is "expected" or is by design.
>
>> So perhaps the thing to be fixed is that describe-variable
>> should say "Standard value" rather than "Original value".
>
> I don't see how that would help.
It will help by not misleading you into thinking that Emacs is showing
you the original value.
>
> The doc you quote says that the std value is recomputed
> _by Customize_, by reevaluating the saved expression.
> Why should that affect `C-h v'?
They both use the same `standard-value' as the "original" (but yes, I
only know this because I read the code).
> I'm guessing that these problems arise because there is
> a type mismatch. But they still shouldn't manifest this
> way, I think.
No, sorry about this type mismatch, it's a complete red herring. Let's
simplify to:
(defcustom time (current-time-string)
"the time"
:type 'string)
Basically the problem stems from passing a non-pure expression
(meaning one that doesn't always give an `equal' result) as the
STANDARD argument to defcustom. Actually, since so many places seem to
assume they will always get the same result, I wonder why the
expression rather than the result of evaluating it is being stored.
^ permalink raw reply [flat|nested] 8+ messages in thread
* bug#4755: 23.1; case where `C-M-x' on defcustom doesn't seem to work
2016-07-05 17:56 ` Noam Postavsky
@ 2016-07-05 18:20 ` Drew Adams
2016-07-09 3:14 ` npostavs
0 siblings, 1 reply; 8+ messages in thread
From: Drew Adams @ 2016-07-05 18:20 UTC (permalink / raw)
To: Noam Postavsky; +Cc: 4755
> > The "original value" should not change, and especially not just
> > by using `C-h v'. It is wrong to say the "original value was"
> > something that it never was and still is not! I don't see any
> > evidence that that behavior is "expected" or is by design.
> >
> >> So perhaps the thing to be fixed is that describe-variable
> >> should say "Standard value" rather than "Original value".
> >
> > I don't see how that would help.
>
> It will help by not misleading you into thinking that Emacs is showing
> you the original value.
It's not showing you the original Lisp expression either, and
users will not have a clue what "standard value" means. (I'm
not sure I really do.) It is apparently a value obtained by
reevaluating the defcustom.
> > The doc you quote says that the std value is recomputed
> > _by Customize_, by reevaluating the saved expression.
> > Why should that affect `C-h v'?
>
> They both use the same `standard-value' as the "original"
> (but yes, I only know this because I read the code).
Yes, I know. But is that TRT? If it is then the help should
make much clearer what it is showing (and why).
IOW, it is showing what the value WOULD BE if the original
Lisp expression were reevaluated in the current context.
If it's doing that, maybe it would be good to say that that
is what it's doing, and to also show the original Lisp sexp?
> > I'm guessing that these problems arise because there is
> > a type mismatch. But they still shouldn't manifest this
> > way, I think.
>
> No, sorry about this type mismatch, it's a complete red
> herring. Let's simplify to:
>
> (defcustom time (current-time-string)
> "the time"
> :type 'string)
>
> Basically the problem stems from passing a non-pure expression
> (meaning one that doesn't always give an `equal' result) as the
> STANDARD argument to defcustom. Actually, since so many places seem to
> assume they will always get the same result, I wonder why the
> expression rather than the result of evaluating it is being stored.
I can see why the expression would be stored. I'm not sure I see
why the expression is not shown to users via `C-h v', and I'm not
sure why the expression is reevaluated by `C-h v' (see above).
But a (copy-sequence...) sexp is pure as far as the top-level
sequence structure is concerned. The individual list elements
are shared, OK, but the top-level list structure is not - it is
new conses.
I don't think that's the problem. The problem is that the
defining sexp gets reevaluated, so the new `foo' sequence gets
copied by reevaluating (copy-sequence...), and the result is
shown as the "original" (or standard) value of `toto'.
That can only be confusing to users, I think.
^ permalink raw reply [flat|nested] 8+ messages in thread
* bug#4755: 23.1; case where `C-M-x' on defcustom doesn't seem to work
2016-07-05 18:20 ` Drew Adams
@ 2016-07-09 3:14 ` npostavs
0 siblings, 0 replies; 8+ messages in thread
From: npostavs @ 2016-07-09 3:14 UTC (permalink / raw)
To: Drew Adams; +Cc: 4755
close 4755
quit
Drew Adams <drew.adams@oracle.com> writes:
> The problem is that the
> defining sexp gets reevaluated, so the new `foo' sequence gets
> copied by reevaluating (copy-sequence...), and the result is
> shown as the "original" (or standard) value of `toto'.
Yes, that's what I meant. Anyway, I'm opening a new bug for this, since
it's not the same as the original, and from experience, I can say that
having multiple bugs per report is confusing.
See http://debbugs.gnu.org/cgi/bugreport.cgi?bug=23926
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2016-07-09 3:14 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-10-19 0:21 bug#4755: 23.1; case where `C-M-x' on defcustom doesn't seem to work Drew Adams
2016-07-05 4:14 ` npostavs
2016-07-05 14:30 ` Drew Adams
2016-07-05 17:00 ` Noam Postavsky
2016-07-05 17:30 ` Drew Adams
2016-07-05 17:56 ` Noam Postavsky
2016-07-05 18:20 ` Drew Adams
2016-07-09 3:14 ` npostavs
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).