unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: akater <nuclearspace@gmail.com>
To: Stefan Monnier <monnier@iro.umontreal.ca>
Cc: emacs-devel@gnu.org
Subject: Re: [PATCH] Some improvements for cl-flet
Date: Sat, 09 Oct 2021 05:33:00 +0000	[thread overview]
Message-ID: <874k9qdapf.fsf@gmail.com> (raw)
In-Reply-To: <jwvy27aiy29.fsf-monnier+emacs@gnu.org>

[-- Attachment #1: Type: text/plain, Size: 4509 bytes --]

Stefan Monnier <monnier@iro.umontreal.ca> writes:

>> +The return value of said lambdas should be either
>> +
>> +- a valid let-binding (SYMBOL function) to be used in let*
>> +  bindings over BODY so that SYMBOL could be used in place of the
>> +  corresponding function name in BODY
>> +
>> +or
>> +
>> +- a list (NIL EXPR) for EXPR to be used in BODY in place of the
>> +  corresponding function name as is.
>
> Can we simplify this so only one of the two is supported?

There are several ways to simplify this.  Here they go, in the order of
attractiveness (to you, as I perceive it):


a.  When flet-expander returns a symbol, plug it in as is.  If it returns
anything else, use it as initial value in a let binding.

This basically mimics the present mechanism.  It sounds good but the question
is, why are we certain that we'll only ever want to plug in symbols.

Plugging in symbols and symbols only is arbitrary, as my example with
symbol-macrolet demonstrates.  Aren't values of type “compiled-function” worth
injecting directly as well?  Arguably more so since at least they won't
evaluate indefinite number of times with possible side effects.  Same applies
to other constant values that include present or future funcallable objects.
What if expander returns nil or t?  We probably should add exception concerning
those.

Overall, such spec involves guessing and eventually will get more complicated
than what we started with.  Which is why I don't recommend a.


b.  Allow building more let bindings than necessary

As long as we have to distinguish between buliding a let binding and plugging
in an external form as is, our lambda must return values of two distinguishable
types.  We might however unconditionally generate let bindings and use return
values of flet-expanders as corresponding initial values.  As was the case with
“a”, the values don't have to specify gensyms then, and can be used directly
instead.  Note however that this would introduce incompatibility with the
existing code due to presence of (func exp) syntax in cl-flet: it might be that
some code that used to evaluate several times at runtime will only evaluate
once.  I understand that this is deemed unlikely (and I wish this logic could
be applied to make consp return its argument for true --- even though this
would not be not CL-compatible).  Good news is, this would also make cl-flet
with (func exp) more predictable.

So far low-level functions of Emacs that generate Elisp code do try to avoid
building more let bindings than necessary.  In fact, cl-flet itself does this
right now.  IIUC, with native compiler in action, we might not care that much
about minimizing let bindings.  However, cleaner code generation helps with
debugging, and not only debugging macros.

My impression is, lispers generaly don't produce cleaner macroexpanded code
because it would take too much time to write a procedure that does and because
they don't see that much value in clean macroexpansions.  I think they are
valuable enough (which is why I took the time to ensure it in the case as
important as cl-flet).  Also, despite the fact that clean macroexpansions are
not fashionable, complaints about difficulty of debugging macros themselves or
of macroexpanded code, are fairly popular.  Cluttered macroexpansions
contribute to that difficulty.

So I don't recommend b either.

c.  Transfer the relevant information from return type of
code-generating lambdas into arguments' types of expand-flet

c.1  We could introduce another argument that explicitly lists the symbols for
which forms returned by flet-expanders are plugged in and no let bindings are
generated.

c.2  The expanders could be specified as either lambdas, in which case the
return value is used in the flet body as is, or, say, singleton vectors
[lambda] in which case the return value of funcall of the 0th element is used
as let-binding.  Downsides: (c.2.1) it might be worth it to make this decision
late rather than early; (c.2.2) the interface gets more complicated and less
reasonable.

In c.2 I picked vector because it makes it less likely to confuse lambda
expressions with something that should not be evaluated but overall I think
complicating expand-flet is a bad idea anyway.  So I don't recommend c as well.


The proposed return value types, (var value) and (nil value), looked more
straightforward to me than alternatives I could think of.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 865 bytes --]

      parent reply	other threads:[~2021-10-09  5:33 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-09-11 12:51 Some improvements for cl-flet akater
2021-09-11 23:32 ` Michael Heerdegen
2021-09-12  3:35   ` akater
2021-09-12 15:38     ` Stefan Monnier
2021-09-13  0:14     ` Michael Heerdegen
2021-09-13  2:26       ` Stefan Monnier
2021-10-07  2:32       ` akater
2021-10-07 18:03         ` Stefan Monnier
2021-10-08 21:57           ` Richard Stallman
2021-10-09  5:23             ` akater
2021-10-09  6:01               ` Michael Heerdegen
2021-10-09 23:37                 ` Richard Stallman
2021-10-10 10:41                   ` Po Lu
2021-10-10 20:27                     ` João Távora
2021-10-10 21:57                       ` Stefan Monnier
2021-10-11  0:45                       ` [External] : " Drew Adams
2021-10-11 21:16                     ` Richard Stallman
2021-10-11 21:26                       ` João Távora
2021-10-12 22:42                         ` Richard Stallman
2021-10-12  0:05                       ` Po Lu
2021-10-12  0:29                       ` Robin Tarsiger
2021-10-12 22:43                         ` Richard Stallman
2021-10-09 23:33               ` Richard Stallman
2021-10-09 23:33               ` Richard Stallman
2021-10-14  4:00               ` Michael Heerdegen
2021-09-23 22:37 ` [PATCH] " akater
2021-09-23 22:41   ` akater
2021-09-24  7:11     ` João Távora
2021-09-24 15:20       ` [PATCH] Some improvements for cl-flet, and some more akater
2021-09-24 16:22         ` João Távora
2021-09-25  1:28         ` Lars Ingebrigtsen
2021-09-25  8:37           ` João Távora
2021-09-24 20:30     ` [PATCH] Some improvements for cl-flet akater
2021-09-26  6:54     ` Lars Ingebrigtsen
2021-09-26 12:04       ` akater
2021-09-26 12:36         ` Lars Ingebrigtsen
2021-10-03  3:51     ` Stefan Monnier
2021-10-07  5:02       ` akater
2021-10-07 18:23         ` Stefan Monnier
2021-11-03 12:59           ` akater
2021-11-09 20:37             ` Stefan Monnier
2021-10-09  5:33       ` akater [this message]

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=874k9qdapf.fsf@gmail.com \
    --to=nuclearspace@gmail.com \
    --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).