all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Stefan Monnier <monnier@iro.umontreal.ca>
To: Tomas Hlavaty <tom@logand.com>
Cc: Jim Porter <jporterbugs@gmail.com>,
	 Karthik Chikmagalur <karthikchikmagalur@gmail.com>,
	 Thomas Koch <thomas@koch.ro>,
	"emacs-devel@gnu.org" <emacs-devel@gnu.org>
Subject: Re: continuation passing in Emacs vs. JUST-THIS-ONE
Date: Sun, 02 Apr 2023 22:09:38 -0400	[thread overview]
Message-ID: <jwvpm8lspqm.fsf-monnier+emacs@gnu.org> (raw)
In-Reply-To: <875yad240l.fsf@logand.com> (Tomas Hlavaty's message of "Mon, 03 Apr 2023 02:39:06 +0200")

> (defun await (future)
>   (let (z)
>     (while (eq 'EAGAIN (setq z (funcall future)))
>       (accept-process-output)
>       (sit-for 0.2))
>     z))

So `await` blocks Emacs.

IOW, your `await` is completely different from Javascript's `await`.

> (defun promise-pipelining-server3 (req)
>   (funcall
>    (byte-compile-sexp
>     (let (f v z)
>       (dolist (x req)
>         (if (atom x)
>             (push x z)
>           (cl-destructuring-bind (k op l r) x
>             (let ((ll (if (symbolp l)
>                           l
>                         (let ((lk (gensym)))
>                           (push `(,lk (slowly-thread ,l)) f)
>                           `(await ,lk))))
>                   (rr (if (symbolp r)
>                           r
>                         (let ((rk (gensym)))
>                           (push `(,rk (slowly-thread ,r)) f)
>                           `(await ,rk)))))
>               (push `(,k (,op ,ll ,rr)) v)))))
>       `(lambda ()
>          (let ,(nreverse f)
>            (let* ,(nreverse v)
>              (list ,@(nreverse z)))))))))

And the use `await` above means that your Emacs will block while waiting
for one result.  `futur-let*` instead lets you compose async operations
without blocking Emacs, and thus works more like Javascript's `await`.

>> This blocks, so it's the equivalent of `futur-wait`.
>> I.e. it's the thing we'd ideally never use.
> I think that futur-wait (or wrapper future-get) aka await is essential
> but what futur.el provides is not sufficient.  There need to be
> different await ways depending on use-case (process, thread, iter).

Not sure what you mean by that.  `futur-wait` does work in different ways
depending on whether it's waiting for a process, a thread, etc: it's
a generic function.

The `iter` case (same for streams) is similar to process filters in that
it doesn't map directly to "futures".  So we'll probably want to
supplement futures with "streams of futures" or something like that to
try and provide a convenient interface for generators, streams, process
filters and such.

> await is necessary for waiting at top-level in any case.

That's what `futur-wait` is for, indeed.

> For top-level waiting in background, use await-in-background instead.

`future-let*` seems to provide a better alternative that doesn't need to
use a busy-loop polling from a timer.

> Calling await immediately after async is useless (simply use blocking
> call).  The point of future is to make the distance between those calls
> as big as possible so that the sum of times in the sequential case is
> replaced with max of times in the parallel case.

You're looking for parallelism.  I'm not.
I'm trying to provide a more convenient interface for async programming,

e.g. when you need to consult a separate executable/server from within
`jit-lock`, so you need to immediately reply to `jit-lock` saying
"pretend it's already highlighted" spawn some async operation to query
the external tool for info, and run some ELisp when the info comes back
(which may require running some other external tool, after which you
need to run some more ELisp, ...).

> I think it is quite different.  What is the point of futur-deliver,
> futur-fail, futur-pure, futur--bind, futur--join, futur-let*,
> futur-multi-bind when the lisp can figure those automatically?

When writing the code by hand, for the cases targeted by my library, you
*have* to use process sentinels.  `futur.el` just provides a fairly thin
layer on top.  Lisp can't just "figure those out" for you.

> Other use-cases would do something different, but once the future is
> computed, it does not change so there is no state to maintain between
> changes of the future.

I'm not talking about saving some state in the future's value.
I'm talking about saving some state in the "continuations/callbacks"
created by `futur-let*` so that when you're called back you don't need
to first manually re-establish your context.

> One more thing: Is futur-abort a good idea?

I don't know.  I can see places where it might make sense to use it, but
I don't know yet whether those places will actually be able to use it,
whether it will work well, ...


        Stefan




  parent reply	other threads:[~2023-04-03  2:09 UTC|newest]

Thread overview: 53+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-03-11 12:53 continuation passing in Emacs vs. JUST-THIS-ONE Thomas Koch
2023-03-12  1:45 ` 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 [this message]
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=jwvpm8lspqm.fsf-monnier+emacs@gnu.org \
    --to=monnier@iro.umontreal.ca \
    --cc=emacs-devel@gnu.org \
    --cc=jporterbugs@gmail.com \
    --cc=karthikchikmagalur@gmail.com \
    --cc=thomas@koch.ro \
    --cc=tom@logand.com \
    /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.