From: Thomas Koch <thomas@koch.ro>
To: "emacs-devel@gnu.org" <emacs-devel@gnu.org>
Subject: continuation passing in Emacs vs. JUST-THIS-ONE
Date: Sat, 11 Mar 2023 14:53:09 +0200 (EET) [thread overview]
Message-ID: <627090382.312345.1678539189382@office.mailbox.org> (raw)
TL;DR: (Why) is there no standard way for continuation passing style[1] ("event driven") programming in Emacs?
During the investigation of an Emacs freeze[1] while starting eglot over tramp, we made a couple of observations. It was proposed to me to share these observations with you. I don't know elips or Emacs internals though, so apologies for any errors.
[1] https://debbugs.gnu.org/61350
Bug #61350 happens because Tramp calls accept-process-output with JUST-THIS-ONE set to t. Tramp does this since Bug #12145[2]. However it seems, that this bug should have been rather fixed in function `find-dired` instead. (See following separate email on this.)
[2] https://debbugs.gnu.org/12145
The JUST-THIS-ONE argument was introduced with this entry in etc/NEWS.22, emphasis from me:
"""
*** Function 'accept-process-output' has a new optional fourth arg
JUST-THIS-ONE. If non-nil, only output from the specified process
is handled, suspending output from other processes. If value is an
integer, also inhibit running timers. THIS FEATURE IS GENERALLY NOT
RECOMMENDED, but may be necessary for specific applications, such as
speech synthesis.
"""
The argument was discussed here:
https://lists.gnu.org/archive/html/emacs-devel/2004-08/msg00141.html
and introduced in this commit:
https://git.savannah.gnu.org/cgit/emacs.git/commit/?id=107ed38d4bdec03002b2a23619e205722cd5b8d1
I don't even think that the original motivation for introducing JUST-THIS-ONE was valid. Unfortunately there was not much discussion about it. It was argued, that it would be hard to make a process filter function reentrant. And I think that this was an invalid root cause analysis to start with.
First, the emacs manual says[3]: "Note that if any of those functions are called by the filter, the filter may be called recursively." - So one should make the filter reentrant, If I understand correctly.
[3] https://www.gnu.org/software/emacs/manual/html_node/elisp/Filter-Functions.html
Second, the manual further says: "Quitting is normally inhibited within a filter function". This indicates to me, that a filter function should be (mostly) "side effect free" besides putting its input somewhere (e.g. in a buffer or message queue) and trigger an event if there is enough input for further processing. This also reduces the risk, that the function could be called recursively in a damaging way.
It seems to me, that there is not yet a standard way in Emacs for continuations (or event driven programming) although the Emacs Wiki refers to the emacs-deferred library: https://www.emacswiki.org/emacs/ConcurrentEmacs
Because there is no such library in Emacs, people either write their own code for continuations (eglot?) or do too much work in a process filter function (speechd-el in 2004 which led to JUST-THIS-ONE).
While I don't know elisp, I unfortunately had to do JavaScript. Like Emacs, JS is single-threaded. While I share the sentiment about JS, there are still things to learn from it, e.g. event driven programming.
See also:
- 2011 emacs-dev discussion: https://lists.gnu.org/archive/html/emacs-devel/2011-05/msg00575.html
- 2016 Blogpost https://jyp.github.io/posts/elisp-cps.html
- https://stable.melpa.org/#/deferred
- https://www.gnu.org/software/emacs/manual///html_node/elisp/Transaction-Queues.html
- Maybe: https://elpa.gnu.org/packages/fsm.html
next reply other threads:[~2023-03-11 12:53 UTC|newest]
Thread overview: 53+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-03-11 12:53 Thomas Koch [this message]
2023-03-12 1:45 ` continuation passing in Emacs vs. JUST-THIS-ONE Jim Porter
2023-03-12 6:33 ` tomas
2023-03-14 6:39 ` Karthik Chikmagalur
2023-03-14 18:58 ` Jim Porter
2023-03-15 17:48 ` Stefan Monnier
2023-03-17 0:17 ` Tomas Hlavaty
2023-03-17 3:08 ` Stefan Monnier
2023-03-17 5:37 ` Jim Porter
2023-03-25 18:42 ` Tomas Hlavaty
2023-03-26 19:35 ` Tomas Hlavaty
2023-03-28 7:23 ` Tomas Hlavaty
2023-03-29 19:00 ` Stefan Monnier
2023-04-03 0:39 ` Tomas Hlavaty
2023-04-03 1:44 ` Emanuel Berg
2023-04-03 2:09 ` Stefan Monnier
2023-04-03 4:03 ` Po Lu
2023-04-03 4:51 ` Jim Porter
2023-04-10 21:47 ` Tomas Hlavaty
2023-04-11 2:53 ` Stefan Monnier
2023-04-11 19:59 ` Tomas Hlavaty
2023-04-11 20:22 ` Stefan Monnier
2023-04-11 23:07 ` Tomas Hlavaty
2023-04-12 6:13 ` Eli Zaretskii
2023-04-17 20:51 ` Tomas Hlavaty
2023-04-18 2:25 ` Eli Zaretskii
2023-04-18 5:01 ` Tomas Hlavaty
2023-04-18 10:35 ` Konstantin Kharlamov
2023-04-18 15:31 ` [External] : " Drew Adams
2023-03-29 18:47 ` Stefan Monnier
2023-04-17 3:46 ` Lynn Winebarger
2023-04-17 19:50 ` Stefan Monnier
2023-04-18 2:56 ` Lynn Winebarger
2023-04-18 3:48 ` Stefan Monnier
2023-04-22 2:48 ` Lynn Winebarger
2023-04-18 6:19 ` Jim Porter
2023-04-18 9:52 ` Po Lu
2023-04-18 12:38 ` Lynn Winebarger
2023-04-18 13:14 ` Stefan Monnier
2023-04-19 0:28 ` Basil L. Contovounesios
2023-04-19 2:59 ` Stefan Monnier
2023-04-19 13:25 ` [External] : " Drew Adams
2023-04-19 13:34 ` Robert Pluim
2023-04-19 14:19 ` Stefan Monnier
2023-04-21 1:33 ` Richard Stallman
2023-04-19 1:11 ` Po Lu
2023-04-17 21:00 ` Tomas Hlavaty
2023-03-14 3:58 ` Richard Stallman
2023-03-14 6:28 ` Jim Porter
2023-03-16 21:35 ` miha
2023-03-16 22:14 ` Jim Porter
2023-03-25 21:05 ` Tomas Hlavaty
2023-03-26 23:50 ` Tomas Hlavaty
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=627090382.312345.1678539189382@office.mailbox.org \
--to=thomas@koch.ro \
--cc=emacs-devel@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.