unofficial mirror of help-gnu-emacs@gnu.org
 help / color / mirror / Atom feed
From: Tomas Hlavaty <tom@logand.com>
To: Stefan Monnier <monnier@iro.umontreal.ca>,
	Hongyi Zhao <hongyi.zhao@gmail.com>
Cc: help-gnu-emacs@gnu.org
Subject: Re: Closures in Emacs and their usage scenarios.
Date: Thu, 30 Sep 2021 00:11:55 +0200	[thread overview]
Message-ID: <87y27fjal0.fsf@logand.com> (raw)
In-Reply-To: <jwvh7e3val7.fsf-monnier+emacs@gnu.org>

On Wed 29 Sep 2021 at 08:28, Stefan Monnier <monnier@iro.umontreal.ca> wrote:
> Tomas Hlavaty [2021-09-29 08:10:36] wrote:
>> On Wed 29 Sep 2021 at 00:04, Stefan Monnier via Users list for the GNU Emacs
>> text editor <help-gnu-emacs@gnu.org> wrote:
>>> And captured variables that are mutated are also quite rare
>> I don't think so.
>
> How rare can depend on the language (as mentioned: they are completely
> absent from Haskell/OCaml and friends),

The topic is: Closures in Emacs and their usage scenarios.

In Emacs Lisp, closures mutating captured variables might be rare now
because lexical scoping arrived recently.

But it opens a new world of possibilities worth learning about.
It should be encouraged.
Many usage scenarios could be seen in Common Lisp and Scheme.

There are examples in the Emacs code base already, see thunk-delay, for
example.

>> The best thing about closures is that they allow wrapping state
>> mutations under simple interface of funcall.

The toggle-counter-direction is an interesting example.

Next step could be showing the wonderful concept of generators;
brilliantly shown, for example, in a solution of the same fringe
problem.  Once one understands this, it is a great way of creating light
weight streams on the spot.  It is also a robust solution to off-by-one
errors often caused by complexities of indexing in complex loops.

@Hongyi Zhao: learn about the same fringe problem and possible
solutions.  It is worth the time and effort.

> but in my experience in ELisp they're the exception rather than the
> rule

Because closures and dynamic binding does not go together well.
Luckily, that is changing now and closures became relevant in ELisp.

> Note also that such mutated+captured variables are more costly (at
> least in the most prevalent way to implement closures).

The cost is mostly theoretical and usually irrelevant for practical
purposes.  I would say on the contrary, the code can be simpler, more
readable and robust and easier to optimize than alternatives.

There is lots of work being done on ELisp compilation, so the future
seems bright.  Maybe representing the captured variables as an alist is
more costly than if it was an array?  (For example, I never had a
performance issue with closures mutating captured variables in sbcl.)
In any case, optimizing this is not really a high priority issue I
think.



  reply	other threads:[~2021-09-29 22:11 UTC|newest]

Thread overview: 71+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-09-27  9:40 Closures in Emacs and their usage scenarios Hongyi Zhao
2021-09-28  2:50 ` Emanuel Berg via Users list for the GNU Emacs text editor
2021-09-28  2:54   ` Emanuel Berg via Users list for the GNU Emacs text editor
2021-09-28  6:46   ` Hongyi Zhao
2021-09-28  8:30     ` Emanuel Berg via Users list for the GNU Emacs text editor
2021-09-28  8:54       ` Hongyi Zhao
2021-09-28 10:39         ` tomas
2021-09-28 11:29           ` Hongyi Zhao
2021-09-28 13:31             ` Emanuel Berg via Users list for the GNU Emacs text editor
2021-09-28 13:50               ` Emanuel Berg via Users list for the GNU Emacs text editor
2021-09-28 13:57             ` tomas
2021-09-28 14:31               ` Hongyi Zhao
2021-09-28 15:25                 ` tomas
2021-09-29  3:59                 ` Emanuel Berg via Users list for the GNU Emacs text editor
2021-09-29  6:43   ` Emanuel Berg via Users list for the GNU Emacs text editor
2021-09-28  2:55 ` Stefan Monnier via Users list for the GNU Emacs text editor
2021-09-28  4:11   ` [External] : " Drew Adams
2021-09-28  4:17     ` Emanuel Berg via Users list for the GNU Emacs text editor
2021-09-28 11:53   ` Arthur Miller
2021-09-28 14:50     ` Hongyi Zhao
2021-09-29  4:04       ` Stefan Monnier via Users list for the GNU Emacs text editor
2021-09-29  6:10         ` Tomas Hlavaty
2021-09-29 12:28           ` Stefan Monnier
2021-09-29 22:11             ` Tomas Hlavaty [this message]
2021-09-29 22:25               ` [External] : " Drew Adams
2021-09-30 10:58                 ` Tomas Hlavaty
2021-09-30 14:55                   ` Drew Adams
2021-09-30 15:54                   ` Emanuel Berg via Users list for the GNU Emacs text editor
2021-10-01  4:35                     ` Hongyi Zhao
2021-09-29 23:06               ` Emanuel Berg via Users list for the GNU Emacs text editor
2021-09-30  0:59               ` Hongyi Zhao
2021-09-30  3:27                 ` Emanuel Berg via Users list for the GNU Emacs text editor
2021-09-30 11:58                 ` Tomas Hlavaty
2021-09-30 13:27                   ` Hongyi Zhao
2021-09-30 15:29                   ` Emanuel Berg via Users list for the GNU Emacs text editor
2021-10-01 14:46               ` Stefan Monnier via Users list for the GNU Emacs text editor
2021-09-29 23:26             ` Emanuel Berg via Users list for the GNU Emacs text editor
2021-10-01  3:37       ` Arthur Miller
2021-10-08 10:53         ` Hongyi Zhao
2021-10-10 14:16           ` Emanuel Berg via Users list for the GNU Emacs text editor
2021-10-10 18:25             ` Marcin Borkowski
2021-10-11 23:16               ` Emanuel Berg via Users list for the GNU Emacs text editor
2021-10-12  5:29                 ` Marcin Borkowski
2021-10-12  5:32                   ` Emanuel Berg via Users list for the GNU Emacs text editor
2021-10-03  9:07     ` Lisp books (was: Re: Closures in Emacs and their usage scenarios.) Emanuel Berg via Users list for the GNU Emacs text editor
2021-10-03 14:41       ` Lisp books Stefan Monnier via Users list for the GNU Emacs text editor
2021-10-05 10:08         ` Emanuel Berg via Users list for the GNU Emacs text editor
2021-10-05 12:57           ` Stefan Monnier via Users list for the GNU Emacs text editor
2021-10-05 14:18             ` Emanuel Berg via Users list for the GNU Emacs text editor
2021-10-06  1:43               ` Stefan Monnier via Users list for the GNU Emacs text editor
2021-10-06  3:20                 ` Emanuel Berg via Users list for the GNU Emacs text editor
2021-10-06  6:44                   ` Emanuel Berg via Users list for the GNU Emacs text editor
2021-10-06  7:06                 ` tomas
2021-10-06 10:17                   ` Emanuel Berg via Users list for the GNU Emacs text editor
2021-10-06 12:37                   ` Stefan Monnier via Users list for the GNU Emacs text editor
2021-10-06 12:54                     ` tomas
2021-10-06 20:24                       ` [OFFPTOPIC] ACM digital library (was: Lisp books) Stefan Monnier via Users list for the GNU Emacs text editor
2021-10-06 20:56                         ` tomas
2021-10-07  6:29                           ` Yuri Khan
2021-10-07  9:10                             ` Emanuel Berg via Users list for the GNU Emacs text editor
2021-10-07 12:42                             ` [OFFPTOPIC] ACM digital library Stefan Monnier
2021-10-12  5:44                         ` [OFFPTOPIC] ACM digital library (was: Lisp books) Emanuel Berg via Users list for the GNU Emacs text editor
2021-10-12 18:11                 ` Lisp books Emanuel Berg via Users list for the GNU Emacs text editor
2021-10-03 15:39       ` [External] : Lisp books (was: Re: Closures in Emacs and their usage scenarios.) Drew Adams
2021-10-05 10:10         ` Emanuel Berg via Users list for the GNU Emacs text editor
2021-10-05 14:32           ` Drew Adams
2021-10-05 14:51             ` Emanuel Berg via Users list for the GNU Emacs text editor
2021-09-28  7:11 ` Closures in Emacs and their usage scenarios Eduardo Ochs
2021-09-28  7:23   ` Emanuel Berg via Users list for the GNU Emacs text editor
2021-09-28  7:33     ` Eduardo Ochs
2021-09-28  8:13   ` Hongyi Zhao

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=87y27fjal0.fsf@logand.com \
    --to=tom@logand.com \
    --cc=help-gnu-emacs@gnu.org \
    --cc=hongyi.zhao@gmail.com \
    --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.
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).