From: "Andreas Röhler" <andreas.roehler@easy-emacs.de>
To: help-gnu-emacs@gnu.org
Subject: Re: `save-excursion' defeated by `set-buffer'
Date: Mon, 14 Mar 2011 15:18:14 +0100 [thread overview]
Message-ID: <4D7E23A6.6070704@easy-emacs.de> (raw)
In-Reply-To: <19836.48264.656000.373465@gargle.gargle.HOWL>
Am 13.03.2011 13:46, schrieb Uday S Reddy:
> Tim X writes:
>
>>> Seems all what's neccessary to know about save-excursion already
>>> is expressed in it's docstring.
>>>
>>
>> Not sure thats true. I've seen a lot of elisp code that does the
>> save-excursion, set buffer pattern, which makes me think maybe the
>> documentation is inadequate.
>
> It seems that reason for the widespread use of the
> save-excursion/set-buffer pattern is actually quite simple. Before
> Emacs version 20.1, there was no other way to do it.
> save-current-buffer was only introduced in 20.1. So, there is a lot
> of old code that uses the old pattern. Now, there is also a lot of
> new code that uses the old pattern because people learn their patterns
> from the old code.
>
>>> If people don't want the buffer restored alongside with point and mark, they
>>> should not use this form.
>>>
>>
>> I think it is a little more subtle than that. People may be using it
>> under the expectation that point and mark will also be saved in the
>> buffer accessed by set-buffer.
>
> No, I don't actually think that. (I notice that Andreas has
> questioned this assumption too.)
>
> If at all people are doing it consciously, they do it because they
> think it is harmless. You want to preserve the current-buffer. But,
> if you also preserve the point and mark, it seems like harmless
> redundancy. So, what is the big deal?
>
> It takes quite a bit of insight into the code to understand that it is
> actually *harmful* redundancy. The unintentional uses of
> save-excursion cover up potential bugs inside the code which don't get
> noticed because of this redundant saving.
>
> So, my test is pure and simple. Convert all the save-excursion's that
> the compiler complains about to save-current-buffer. If your code
> continues to run perfectly, you are my hero. If your code falls over,
> then you should accept that your code is buggy and it is only able to
> stand up on the crutches of what you thought was "harmless
> redundancy". Then it is up to you whether you want to fix the code or
> continue to live with it. But there are many of us who won't touch
> such code with a tadpole because we regard it as buggy.
>
>> Except we know it is often used incorrectly. I think Uday's point is
>> very valid here. When writing code, part of the aim is to communicate
>> intentions to others who may need to maintain or update the code in the
>> future. As Uday pointed out, using save-excursion followed by set-buffer
>> muddies the intention and decreases clarity.
>
> Unfortunately, it is more than a question of clarity. It is a
> question of correctness. Let me restate my example from Friday a bit
> more explicitly
>
> (defun my-beautiful-function ()
> (save-excursion
> (set-buffer B)
> (goto-char x)
> (setq a (find-something))
> ...))
>
> (defun find-something ()
> (....
> (set-buffer A)
> (goto-char y)
> ...))
>
> find-something is *buggy* here. It is moving point in buffer A though
> it wasn't supposed to. However, my-beautiful-function works fine as
> long as I call it in buffer A because the "harmlessly redundant"
> save-excursion at its top-level restores A's point.
>
> Tomorrow, you decide to call my-beautiful-function from some other
> buffer C, and all hell breaks loose. You suddenly find that the point
> is moving in the unrelated buffer A and you have no idea why.
>
> So, rewrite the code as follows:
>
> (defun my-beautiful-function ()
> (save-current-buffer
> (set-buffer B)
> (goto-char x)
> ...
> (setq a (find-something))
> ...))
>
> (defun find-something ()
> (....
> (save-current-buffer
> (set-buffer A)
> (save-excursion
> (goto-char y)
> ...)))
>
> Not only would you have mollified the compiler, but you will have much
> more robust code that will continue to function when used in
> unforeseen ways.
>
> Cheers,
> Uday
>
>
Hi Uday,
thanks trying so hard to explain your stand.
AFAIU you are undergoing some basic mistake. It's of the kind probably
every one at this list already experienced it: getting things wrong
which are trivial alltogether.
IMHO best method in these circumstances is changing the sujet, walking
out, some relax.
Maybe let's have a break with that matter. Don't mix up VM :-)
Andreas
next prev parent reply other threads:[~2011-03-14 14:18 UTC|newest]
Thread overview: 113+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <mailman.0.1299085819.4487.help-gnu-emacs@gnu.org>
2011-03-02 20:54 ` `save-excursion' defeated by `set-buffer' Uday Reddy
2011-03-05 4:28 ` Stefan Monnier
2011-03-10 19:57 ` Andreas Röhler
2011-03-11 1:07 ` Leo
2011-03-11 1:28 ` Stefan Monnier
2011-03-11 8:52 ` Andreas Röhler
[not found] ` <mailman.25.1299833256.26376.help-gnu-emacs@gnu.org>
2011-03-11 9:54 ` David Kastrup
2011-03-11 11:09 ` Andreas Röhler
[not found] ` <mailman.10.1299841456.13496.help-gnu-emacs@gnu.org>
2011-03-11 11:38 ` David Kastrup
2011-03-11 15:52 ` Stefan Monnier
2011-03-12 8:59 ` Eli Zaretskii
2011-03-12 19:00 ` Andreas Röhler
2011-03-12 19:56 ` Drew Adams
2011-03-12 20:27 ` Eli Zaretskii
2011-03-12 22:20 ` Drew Adams
2011-03-14 18:59 ` Juanma Barranquero
2011-03-14 21:17 ` Drew Adams
[not found] ` <mailman.6.1299959800.9013.help-gnu-emacs@gnu.org>
2011-03-13 3:00 ` Uday Reddy
2011-03-13 18:22 ` Drew Adams
[not found] ` <mailman.0.1300040583.10860.help-gnu-emacs@gnu.org>
2011-03-14 1:04 ` Uday Reddy
2011-03-14 8:43 ` Drew Adams
[not found] ` <mailman.4.1299956141.9013.help-gnu-emacs@gnu.org>
2011-03-12 22:29 ` Tim X
2011-03-13 7:15 ` Andreas Röhler
2011-03-13 18:23 ` Drew Adams
2011-03-13 12:46 ` Uday S Reddy
2011-03-14 8:47 ` Drew Adams
[not found] ` <mailman.7.1300092490.2602.help-gnu-emacs@gnu.org>
2011-03-14 12:22 ` Uday Reddy
2011-03-14 14:20 ` Uday S Reddy
2011-03-14 17:36 ` Drew Adams
2011-03-14 23:20 ` Uday S Reddy
2011-03-15 3:55 ` Drew Adams
[not found] ` <mailman.14.1300124226.2531.help-gnu-emacs@gnu.org>
2011-03-15 14:39 ` Stefan Monnier
2011-03-15 15:59 ` Drew Adams
[not found] ` <mailman.2.1300204800.1264.help-gnu-emacs@gnu.org>
2011-03-15 17:46 ` Stefan Monnier
2011-03-15 18:55 ` Drew Adams
2011-03-14 14:18 ` Andreas Röhler [this message]
[not found] ` <mailman.5.1300111985.27831.help-gnu-emacs@gnu.org>
2011-03-14 14:54 ` Uday Reddy
[not found] ` <mailman.5.1300000253.31664.help-gnu-emacs@gnu.org>
2011-03-13 14:16 ` Uday Reddy
2011-03-13 18:25 ` Drew Adams
[not found] ` <mailman.2.1300040743.10860.help-gnu-emacs@gnu.org>
2011-03-13 20:48 ` Uday Reddy
2011-03-14 0:31 ` Drew Adams
[not found] ` <mailman.4.1300066631.25374.help-gnu-emacs@gnu.org>
2011-03-14 14:34 ` Stefan Monnier
2011-03-13 2:11 ` Uday Reddy
2011-03-13 18:26 ` Drew Adams
[not found] ` <mailman.5.1299920357.7270.help-gnu-emacs@gnu.org>
2011-03-12 9:34 ` David Kastrup
2011-03-12 10:12 ` Eli Zaretskii
[not found] ` <mailman.10.1299924724.7270.help-gnu-emacs@gnu.org>
2011-03-12 10:42 ` David Kastrup
2011-03-12 12:28 ` Eli Zaretskii
2011-03-12 15:17 ` Uday Reddy
2011-03-12 15:25 ` David Kastrup
2011-03-13 2:40 ` Uday Reddy
2011-03-14 14:25 ` Stefan Monnier
2011-03-14 17:26 ` Andreas Röhler
[not found] ` <mailman.11.1300123292.2531.help-gnu-emacs@gnu.org>
2011-03-15 14:35 ` Stefan Monnier
2011-03-15 14:47 ` David Kastrup
2011-03-15 15:19 ` PJ Weisberg
2011-03-15 16:00 ` Drew Adams
[not found] ` <mailman.6.1300202904.14512.help-gnu-emacs@gnu.org>
2011-03-15 17:42 ` Stefan Monnier
[not found] ` <mailman.3.1300204850.1264.help-gnu-emacs@gnu.org>
2011-03-15 17:49 ` Stefan Monnier
2011-03-15 18:56 ` Drew Adams
2011-03-15 21:30 ` Stefan Monnier
2011-03-15 19:02 ` Jason Earl
2011-03-15 20:55 ` Drew Adams
2011-03-16 4:31 ` rusi
2011-03-16 8:11 ` David Kastrup
2011-03-17 3:46 ` rusi
2011-03-17 7:10 ` rusi
2011-03-17 8:29 ` Antoine Levitt
[not found] ` <mailman.1.1300215374.6982.help-gnu-emacs@gnu.org>
2011-03-16 12:05 ` Uday S Reddy
2011-03-12 22:18 ` Tim X
2011-03-11 23:06 ` Uday Reddy
2011-03-10 22:40 ` David Kastrup
2011-03-11 2:46 ` Stefan Monnier
2011-04-01 3:20 ` rusi
2011-04-01 12:39 ` Uday Reddy
2011-03-02 17:12 Andreas Röhler
2011-03-03 4:58 ` Le Wang
[not found] ` <mailman.7.1299128292.20537.help-gnu-emacs@gnu.org>
2011-03-13 15:05 ` Uday Reddy
-- strict thread matches above, loose matches on Subject: below --
2009-12-20 19:19 Roland Winkler
2009-12-21 15:26 ` Stefan Monnier
2009-12-21 16:23 ` David Kastrup
2009-12-22 12:51 ` martin rudalics
2009-12-23 0:45 ` Stefan Monnier
2009-12-23 9:07 ` David Kastrup
2009-12-24 4:35 ` Stefan Monnier
2009-12-24 9:03 ` David Kastrup
2009-12-29 16:01 ` Stefan Monnier
2010-01-04 9:09 ` Drew Adams
2010-01-04 18:30 ` Stefan Monnier
2010-01-05 20:17 ` David Kastrup
2010-01-06 0:02 ` Drew Adams
2010-01-06 4:20 ` Stefan Monnier
2010-01-06 8:07 ` David Kastrup
2010-01-06 8:57 ` Drew Adams
2010-01-10 4:57 ` Stefan Monnier
2010-01-10 8:12 ` David Kastrup
2010-01-10 21:43 ` Stefan Monnier
2010-01-11 8:24 ` David Kastrup
2010-01-11 9:21 ` martin rudalics
2010-01-11 16:50 ` Stefan Monnier
2010-01-10 17:03 ` Drew Adams
2010-01-10 4:51 ` Stefan Monnier
2010-01-10 15:58 ` Harald Hanche-Olsen
2010-01-10 18:05 ` martin rudalics
2010-01-10 18:06 ` Drew Adams
2010-01-10 19:44 ` Harald Hanche-Olsen
2009-12-24 14:04 ` Roland Winkler
2010-01-04 17:08 ` Davis Herring
2010-01-04 17:34 ` David Kastrup
2010-01-04 18:33 ` Stefan Monnier
2009-12-18 9:20 Eli Zaretskii
2009-12-18 15:29 ` Juanma Barranquero
2009-12-18 15:58 ` Thierry Volpiatto
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4D7E23A6.6070704@easy-emacs.de \
--to=andreas.roehler@easy-emacs.de \
--cc=help-gnu-emacs@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.