unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Davis Herring <herring@lanl.gov>
To: Eli Zaretskii <eliz@gnu.org>,
	Daniel Colascione <dancol@dancol.org>,
	monnier@iro.umontreal.ca
Cc: emacs-devel@gnu.org
Subject: Re: Unbalanced change hooks (part 2) [Documentation fix still remaining]
Date: Thu, 1 Sep 2016 15:25:01 -0600	[thread overview]
Message-ID: <8f54985c-09f9-ad1f-6132-43e7c04fc2a9@lanl.gov> (raw)
In-Reply-To: <83inujbpek.fsf@gnu.org>

> This is a naïve interpretation of what a "change" means and entails.
> In reality, some changes are done with a single call to an insdel
> function, while others need multiple calls that delete and insert text
> piecemeal.  Thus the need to call the hooks before and after each
> insdel call only sometimes.

Indeed, no one knows what we mean by "change".  To make progress, we 
must introduce a formal definition for it, in particular in conjunction 
with the word "before" -- preferably a definition that the current 
implementation satisfies but that allows useful reasoning.

As has been said, some of the proposed documentation that disclaims 
"pairing" produces a definition that is satisfied but is uselessly vague 
-- allowing the implementation to simply call b-c-f once with 
(point-min) and (point-max) when the buffer is created, and never again. 
  (Changes beyond the initial (point-max) are simply insertions into 
that interval!)

However, we intuitively know that b-c-f is supposed to be called 
"immediately before" a change; what does that mean?  Certainly it is not 
a statement about the real passage of time or function calls.  It has to 
be based on an ordering of relevant events -- b-c-f calls, a-c-f calls, 
and the changes themselves.  The "properly paired" ideal defines 
"immediately before" as "with no change intervening" (and similarly for 
a-c-f), disallowing the implementation from reporting what Dan calls 
"fine-grained" changes only via a-c-f.

We can offer a weaker (but still useful) formal guarantee that the 
current implementation does satisfy phrased instead in terms of 
_absence_ of change: a call to a-c-f "publishes" an interval of text 
where changes have been completed and which shall not be altered until 
after a subsequent b-c-f call that "unlocks" it.  (These intervals act 
like rear-advancing overlays: a zero-length interval must be unlocked to 
allow an insertion, and an a-c-f call that covers an unlocked interval 
entirely destroys it without any zero-length remainder.)  Lack of 
alteration is easier to define than change (because it is a state 
function, not a path function), and it is what all caching clients rely 
on for the validity of their caches.

There remains a gap in the information provided by this guarantee (and 
the current implementation): when no a-c-f region corresponds exactly to 
a preceding b-c-f call, clients are left to wonder whether more changes 
may yet occur.  At the least, we must publish all text before redisplay 
(to prevent the user from observing text not yet processed by a-c-f), 
but we can leave redisplay out of it by having each function which 
currently makes "unpaired" calls do one of several things when it exits:

1. Make an additional call to a-c-f that covers the whole region (which, 
in this interpretation, is not a violation because a-c-f is a promise 
not to modify in the future rather than a statement about modifications 
in the past).  This destroys the utility of the smaller a-c-f regions, 
of course.

2. Call some new hook to indicate that the remaining unlocked text has 
been republished in its original state.  (Note that it does not matter 
if the text was actually changed and then changed back, so long as all 
text properties and markers were restored and no other hooks were called.)

3. Make another call to b-c-f and a-c-f with, say, (point-max) 
(point-max).  We would then document that each call to b-c-f (for a 
buffer) indicates that any text not covered by a-c-f since the last 
b-c-f is republished unaltered.  This fits the current implementation 
and the intuitive idea that b-c-f is called before "each" change because 
it separates changes into epochs demarcated by b-c-f.

I therefore propose approach #3 as the minimal change to the current 
implementation that provides a behavioral guarantee worth documenting. 
Moreover, the demarcation of changes into epochs allows interested 
clients to work with the "paired" behavior by deferring a-c-f operations 
until the next b-c-f or precisely matching a-c-f.  (If all functions 
follow #3, then either the first a-c-f matches or the sequence will be 
terminated by a b-c-f.)

Davis

-- 
This product is sold by volume, not by mass.  If it appears too dense or 
too sparse, it is because mass-energy conversion has occurred during 
shipping.



  parent reply	other threads:[~2016-09-01 21:25 UTC|newest]

Thread overview: 189+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-07-31 12:16 Unbalanced change hooks (part 2) Alan Mackenzie
2016-07-31 13:58 ` Noam Postavsky
2016-07-31 15:21   ` Alan Mackenzie
2016-07-31 15:03 ` Eli Zaretskii
2016-07-31 17:28   ` Alan Mackenzie
2016-07-31 18:11     ` Eli Zaretskii
2016-07-31 18:52       ` Eli Zaretskii
2016-07-31 19:08         ` Eli Zaretskii
2016-07-31 19:20       ` Noam Postavsky
2016-07-31 21:26       ` Alan Mackenzie
2016-08-01 13:01         ` Stefan Monnier
2016-08-01 13:07         ` Eli Zaretskii
2016-08-01 16:53           ` Alan Mackenzie
2016-08-01 17:15             ` Alan Mackenzie
2016-08-01 19:39               ` Eli Zaretskii
2016-08-01 20:52                 ` Alan Mackenzie
2016-08-02 14:44                   ` Eli Zaretskii
2016-08-02 16:09                     ` Alan Mackenzie
2016-08-02 16:42                       ` Eli Zaretskii
2016-08-02 17:24                       ` Stefan Monnier
2016-08-07 14:49                         ` Alan Mackenzie
2016-08-07 15:09                           ` Stefan Monnier
2016-08-07 21:48                             ` Alan Mackenzie
2016-08-08  0:55                               ` Stefan Monnier
2016-08-02 14:46                   ` Stefan Monnier
2016-08-01 19:37             ` Eli Zaretskii
2016-08-02 14:39             ` Stefan Monnier
2016-07-31 18:55     ` Stefan Monnier
2016-07-31 19:26       ` Eli Zaretskii
2016-07-31 21:59         ` Stefan Monnier
2016-08-01 13:09           ` Eli Zaretskii
2016-08-01 14:36             ` Stefan Monnier
2016-08-01 14:48               ` Eli Zaretskii
2016-08-01 15:28                 ` Stefan Monnier
2016-07-31 19:33       ` Alan Mackenzie
2016-07-31 19:21     ` Eli Zaretskii
2016-08-09 15:01   ` Alan Mackenzie
2016-08-09 15:14     ` Eli Zaretskii
2016-08-19 14:51   ` Phillip Lord
2016-08-30  1:15     ` Stefan Monnier
2016-08-30 14:34       ` Phillip Lord
2016-08-30 15:11         ` Stefan Monnier
2016-08-31 11:00           ` Phillip Lord
2016-08-31 12:24             ` Stefan Monnier
2016-09-01  6:49               ` Phillip Lord
2016-09-01 13:36                 ` Stefan Monnier
2016-09-01  6:40           ` Phillip Lord
2016-09-01 13:33             ` Stefan Monnier
2016-09-02 11:34               ` Phillip Lord
2016-08-30 16:08         ` Eli Zaretskii
2016-08-01 16:38 ` Richard Stallman
2016-08-02 10:15   ` Alan Mackenzie
2016-08-02 10:37     ` Richard Copley
2016-08-02 16:11       ` Alan Mackenzie
2016-08-02 14:57     ` Eli Zaretskii
2016-08-02 16:55       ` Alan Mackenzie
2016-08-02 17:17         ` Eli Zaretskii
2016-08-02 18:30           ` Eli Zaretskii
2016-08-02 19:38             ` Alan Mackenzie
2016-08-03  2:36               ` Eli Zaretskii
2016-08-08 14:36             ` Alan Mackenzie
2016-08-08 15:42               ` Eli Zaretskii
2016-08-08 16:54                 ` Alan Mackenzie
2016-08-08 17:17                   ` Eli Zaretskii
2016-08-08 18:42                     ` Alan Mackenzie
2016-08-08 19:04                       ` Eli Zaretskii
2016-08-08 19:54                         ` Unbalanced change hooks (part 2) [PATCH] Alan Mackenzie
2016-08-09 15:08                           ` Eli Zaretskii
2016-08-09 16:38                             ` Unbalanced change hooks (part 2) [Documentation fix still remaining] Alan Mackenzie
2016-08-09 16:42                               ` Eli Zaretskii
2016-08-09 18:13                                 ` Eli Zaretskii
2016-08-09 18:35                                   ` Alan Mackenzie
2016-08-09 17:14                               ` Stefan Monnier
2016-08-09 18:19                                 ` Eli Zaretskii
2016-08-09 19:09                                   ` Stefan Monnier
2016-08-10 14:21                                     ` Eli Zaretskii
2016-08-10 14:56                                       ` Stefan Monnier
2016-08-10 15:16                                         ` Alan Mackenzie
2016-08-10 15:44                                           ` Stefan Monnier
2016-08-10 16:03                                         ` Eli Zaretskii
2016-08-10 16:11                                           ` Stefan Monnier
2016-08-18 14:26                                             ` Eli Zaretskii
2016-08-18 16:56                                               ` Stefan Monnier
2016-08-19  8:45                                               ` Alan Mackenzie
2016-08-19  9:12                                                 ` Eli Zaretskii
2016-08-19  9:21                                                   ` Stefan Monnier
2016-08-19  9:39                                                     ` Eli Zaretskii
2016-08-19  9:19                                                 ` Stefan Monnier
2016-08-10 16:18                                           ` Alan Mackenzie
2016-08-10 16:54                                             ` Eli Zaretskii
2016-08-10 17:49                                               ` Alan Mackenzie
2016-08-10 18:10                                                 ` Eli Zaretskii
2016-08-10 18:57                                               ` Alan Mackenzie
2016-08-10 19:08                                                 ` Eli Zaretskii
2016-08-10 19:50                                                 ` Stefan Monnier
2016-08-11 11:29                                                   ` Alan Mackenzie
2016-08-11 16:43                                                     ` Stefan Monnier
2016-08-28 11:23                                                       ` Daniel Colascione
2016-08-28 15:01                                                         ` Stefan Monnier
2016-08-28 22:16                                                           ` Daniel Colascione
2016-08-28 22:44                                                             ` Stefan Monnier
2016-08-28 23:11                                                               ` Daniel Colascione
2016-08-29  0:09                                                                 ` Stefan Monnier
2016-08-29  3:18                                                                   ` Daniel Colascione
2016-08-29 13:00                                                                     ` Stefan Monnier
2016-08-29 14:51                                                                       ` Eli Zaretskii
2016-08-29 15:50                                                                         ` Stefan Monnier
2016-08-29 16:22                                                                           ` Eli Zaretskii
2016-08-29 15:14                                                                       ` Daniel Colascione
2016-08-29 15:44                                                                         ` Stefan Monnier
2016-08-30 14:07                                                                           ` Phillip Lord
2016-08-30 15:51                                                                             ` Eli Zaretskii
2016-08-30 16:22                                                                               ` Daniel Colascione
2016-08-30 16:46                                                                                 ` Eli Zaretskii
2016-08-29 14:50                                                                     ` Eli Zaretskii
2016-08-29 15:30                                                                       ` Daniel Colascione
2016-08-29 16:20                                                                         ` Eli Zaretskii
2016-08-29 16:26                                                                           ` Daniel Colascione
2016-08-29 17:01                                                                             ` Eli Zaretskii
2016-08-29 17:48                                                                               ` Daniel Colascione
2016-08-29 18:04                                                                                 ` Eli Zaretskii
2016-08-29 18:16                                                                                   ` Eli Zaretskii
2016-08-30  2:27                                                                                     ` Daniel Colascione
2016-08-30  2:44                                                                                       ` Eli Zaretskii
2016-08-30  0:25                                                                                   ` Stefan Monnier
2016-08-30  2:26                                                                                     ` Daniel Colascione
2016-08-30  2:38                                                                                     ` Eli Zaretskii
2016-08-30  2:54                                                                                       ` Daniel Colascione
2016-08-30 14:20                                                                                         ` Phillip Lord
2016-08-30 15:08                                                                                         ` Eli Zaretskii
2016-08-30 12:56                                                                                       ` Stefan Monnier
2016-08-30 14:12                                                                       ` Phillip Lord
2016-08-30 16:06                                                                         ` Eli Zaretskii
2016-08-31 11:20                                                                           ` Phillip Lord
2016-08-31 14:57                                                                             ` Eli Zaretskii
2016-08-30 17:12                                                                       ` Alan Mackenzie
2016-08-30 17:27                                                                         ` Daniel Colascione
2016-08-30 17:42                                                                           ` Eli Zaretskii
2016-08-30 17:46                                                                             ` Daniel Colascione
2016-08-30 18:00                                                                               ` Eli Zaretskii
2016-08-30 18:04                                                                                 ` Daniel Colascione
2016-08-30 18:46                                                                                   ` Eli Zaretskii
2016-08-30 18:58                                                                                     ` Daniel Colascione
2016-08-30 19:17                                                                                       ` Eli Zaretskii
2016-08-30 21:46                                                                                     ` Stefan Monnier
2016-08-31  2:38                                                                                       ` Eli Zaretskii
2016-08-30 18:27                                                                                 ` Stefan Monnier
2016-09-01 13:46                                                                                   ` Eli Zaretskii
2016-08-30 18:01                                                                               ` Alan Mackenzie
2016-08-30 18:06                                                                                 ` Daniel Colascione
2016-08-30 18:17                                                                                   ` Daniel Colascione
2016-08-30 18:30                                                                                     ` Alan Mackenzie
2016-08-30 18:32                                                                                       ` Daniel Colascione
2016-08-30 18:47                                                                                         ` Alan Mackenzie
2016-08-30 18:55                                                                                           ` Daniel Colascione
2016-08-30 19:14                                                                                             ` Alan Mackenzie
2016-08-30 20:34                                                                                               ` Stefan Monnier
2016-08-30 20:53                                                                                                 ` Alan Mackenzie
2016-08-30 21:37                                                                                                   ` Stefan Monnier
2016-08-30 18:36                                                                                       ` Stefan Monnier
2016-08-30 18:22                                                                             ` Stefan Monnier
2016-08-30 18:00                                                                           ` Stefan Monnier
2016-08-30 17:27                                                                         ` Eli Zaretskii
2016-08-30 17:42                                                                           ` Alan Mackenzie
2016-08-30 17:53                                                                             ` Eli Zaretskii
2016-08-30 18:16                                                                               ` Alan Mackenzie
2016-08-30 18:51                                                                                 ` Eli Zaretskii
2016-08-30 19:00                                                                                   ` Alan Mackenzie
2016-08-30 18:14                                                                             ` Stefan Monnier
2016-09-01 21:25                                                                       ` Davis Herring [this message]
2016-09-02  7:26                                                                         ` Eli Zaretskii
2016-08-28 22:36                                                         ` Stefan Monnier
2016-08-30 13:30                                                         ` Phillip Lord
2016-08-30 13:39                                                           ` Stefan Monnier
2016-08-31 11:04                                                             ` Phillip Lord
2016-08-30 15:47                                                           ` Eli Zaretskii
2016-08-30 16:01                                                             ` Stefan Monnier
2016-08-30 16:58                                                               ` Eli Zaretskii
2016-08-30 17:57                                                                 ` Stefan Monnier
2016-08-31 11:17                                                                   ` Phillip Lord
2016-08-31 11:12                                                                 ` Phillip Lord
2016-08-30 16:23                                                             ` Daniel Colascione
2016-08-30 16:53                                                               ` Eli Zaretskii
2016-08-02 19:00           ` Unbalanced change hooks (part 2) Alan Mackenzie
2016-08-02 19:25             ` Eli Zaretskii
2016-08-07 21:16               ` Alan Mackenzie
2016-08-08 15:38                 ` Eli Zaretskii
2016-08-08 19:56                 ` Stefan Monnier
2016-08-08 20:16                   ` Alan Mackenzie

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

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=8f54985c-09f9-ad1f-6132-43e7c04fc2a9@lanl.gov \
    --to=herring@lanl.gov \
    --cc=dancol@dancol.org \
    --cc=eliz@gnu.org \
    --cc=emacs-devel@gnu.org \
    --cc=monnier@iro.umontreal.ca \
    /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 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).