unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Tomas Hlavaty <tom@logand.com>
To: Eli Zaretskii <eliz@gnu.org>
Cc: rudi@constantly.at, emacs-devel@gnu.org
Subject: Re: using finalizers
Date: Sun, 02 Jan 2022 08:53:31 +0100	[thread overview]
Message-ID: <87r19qk1z8.fsf@logand.com> (raw)
In-Reply-To: <83tuemeif5.fsf@gnu.org>

On Sun 02 Jan 2022 at 08:54, Eli Zaretskii <eliz@gnu.org> wrote:
> One common paradigm for such use cases is to use a callback: the
> function that traverses some collection of objects calls that callback
> for every object it finds.

There is no such thing in directory-files.

Also using callbacks in directory-files alone would not fix
find-lisp-find-dired.  I think an extra execution thread would be
needed.  Maybe using an extra execution thread could be seen as a work
around for the negative consequences of stack discipline.  If there was
a callback in directory-files, it would allow for pushing directory
items out of the execution thread when encountered, instead of waiting
until the contents of the whole directory has been collected.

> There are usually protocols for the callback to stop the process and
> prevent the rest of objects from being examined/reported.

There is no such thing in directory-files.

I can't see such thing in any other mapping functions in Emacs Lisp.
Could you point me to an example?

Also, such protocols are non-trivial and usually complicate the code
significantly.  See for example how people deal with it JavaScript,
where they have no other choice.

>> But when should close be called, when such stream is lazy?  I am
>> sure a reasonable ad-hoc solution could be implemented.  But what if
>> the directory is traversed recursively?  When should each close be
>> called?  A case for another ad-hoc solution?  Looks like finalizers
>> would be great here.
>
> We have the unwind-protect machinery in place for that.  In fact, if
> you look at the implementation of directory-files, you will see that
> it already uses that machinery, and it most probably actually kicked
> in when you typed C-g above.

I see I did not manage to get the point across.  directory-files is
"eager" and follows stack discipline so unwind-protect there makes
sense.  But the idea of directory-files itself is broken as I
demonstrated previously.  Operating systems get it right and provide
streaming API with open/read/close directory functions.  Also the
brokenness of directory-files propagates to many other points in Emacs
that need to list directories, like find-lisp-find-dired and completion.

But the point here was that in case of lazy sequences, the point in time
where close should be called is not known upfront.  One would have to
split the code into two parts: eager one which would force stack
discipline and lazy one which would do the lazy part.  Maybe doable for
trivial thing like lazy listing of a single directory, but it gets
harder when doing something non-trivial like lazy listing of a directory
recursively.



  reply	other threads:[~2022-01-02  7:53 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-12-30 22:43 using finalizers Tomas Hlavaty
2021-12-31  2:46 ` LdBeth
2021-12-31  3:29   ` Stefan Monnier
2021-12-31  3:36     ` Stefan Monnier
2021-12-31  4:30     ` LdBeth
2021-12-31  4:43       ` LdBeth
2021-12-31  6:28   ` Tomas Hlavaty
2021-12-31 10:59     ` LdBeth
2021-12-31 11:18       ` Tomas Hlavaty
2021-12-31 11:41         ` LdBeth
2021-12-31 12:01           ` Tomas Hlavaty
2022-01-01 17:00     ` Stefan Monnier
2022-01-01 20:25       ` Tomas Hlavaty
2022-01-01 20:47         ` Stefan Monnier
2022-01-01 22:55           ` Tomas Hlavaty
2022-01-01 23:18             ` Stefan Monnier
2022-01-01 23:47               ` Tomas Hlavaty
2022-01-01 23:26             ` Tomas Hlavaty
2021-12-31  7:50   ` Eli Zaretskii
2021-12-31  9:31     ` Tomas Hlavaty
2021-12-31 12:27       ` Eli Zaretskii
2022-01-01 17:58         ` Tomas Hlavaty
2022-01-01 18:20           ` Eli Zaretskii
2022-01-01 20:55             ` Stefan Monnier
2022-01-01 23:05               ` Tomas Hlavaty
2022-01-01 23:21                 ` Stefan Monnier
2021-12-31 14:23       ` Rudolf Schlatte
2021-12-31 16:21         ` Stefan Monnier
2022-01-01 17:37           ` Tomas Hlavaty
2022-01-01 22:36         ` Tomas Hlavaty
2022-01-02  6:54           ` Eli Zaretskii
2022-01-02  7:53             ` Tomas Hlavaty [this message]
2022-01-02  8:33               ` Eli Zaretskii
2022-01-02 13:10                 ` Tomas Hlavaty
2022-01-02 14:42                   ` Eli Zaretskii
2022-01-02 15:16                     ` Eli Zaretskii
2022-01-02 17:18                       ` Tomas Hlavaty
2022-01-02 18:11           ` Rudolf Schlatte
2022-01-03  0:37             ` Tomas Hlavaty
2022-01-04  3:08               ` Richard Stallman
2021-12-31 14:39 ` LdBeth
2022-01-01 17:59   ` 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

  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=87r19qk1z8.fsf@logand.com \
    --to=tom@logand.com \
    --cc=eliz@gnu.org \
    --cc=emacs-devel@gnu.org \
    --cc=rudi@constantly.at \
    /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).