From: Stefan Monnier <monnier@iro.umontreal.ca>
To: Sean Whitton <spwhitton@spwhitton.name>
Cc: emacs-devel@gnu.org
Subject: Re: [PATCH] Adding with-gensyms and once-only to subr-x
Date: Mon, 11 Apr 2022 13:26:12 -0400 [thread overview]
Message-ID: <jwv5ynfy2fy.fsf-monnier+emacs@gnu.org> (raw)
In-Reply-To: <877d7vr1uy.fsf@athena.silentflame.com> (Sean Whitton's message of "Mon, 11 Apr 2022 10:01:09 -0700")
>>> Lately I have been finding myself wanting with-gensyms and once-only,
>>> two classic macro-writing macros, available in core Elisp. (There is
>>> already org-with-gensyms, but it's not in the least bit Org-specific.)
>> I think `once-only` is what we (well, I) called `macroexp-let2`.
> Ah, thank you for the pointer.
>
> (macroexp-let2* nil ((foo foo) (bar bar)) FORMS)
>
> is quite a bit more verbose than (once-only (foo bar) FORMS), however.
> So I would be inclined to keep once-only, though reimplemented in terms
> of macroexp-let2*. Does that sound reasonable?
How 'bout making `macroexp-let2*` accept the shorter form as in the
patch below?
I'm not in love with the name `macroexp-let2*` but I find the name
`once-only` to lack context. So we could consider renaming, but I'd
favor making it live in `macroexp.el` (and come with a `macroexp-`
prefix). It could be called `macroexp-once-only` or
`macroexp-eval-now`, or we could go crazy with names like
`macroexp-copyableize`.
Stefan
diff --git a/lisp/emacs-lisp/macroexp.el b/lisp/emacs-lisp/macroexp.el
index 1420655f1e9..4783e55e057 100644
--- a/lisp/emacs-lisp/macroexp.el
+++ b/lisp/emacs-lisp/macroexp.el
@@ -636,12 +636,20 @@ macroexp-let2
(defmacro macroexp-let2* (test bindings &rest body)
"Multiple binding version of `macroexp-let2'.
-BINDINGS is a list of elements of the form (SYM EXP). Each EXP
-can refer to symbols specified earlier in the binding list."
+BINDINGS is a list of elements of the form (SYM EXP) or just SYM,
+which then stands for (SYM SYM).
+Each EXP can refer to symbols specified earlier in the binding list.
+
+TEST has to be a symbol, and if it is nil it can be omitted."
(declare (indent 2) (debug (sexp (&rest (sexp form)) body)))
+ (when (consp test) ;; `test' was omitted.
+ (push bindings body)
+ (setq bindings test)
+ (setq test nil))
(pcase-exhaustive bindings
('nil (macroexp-progn body))
- (`((,var ,exp) . ,tl)
+ (`(,(or `(,var ,exp) (and (pred symbolp) ,var (let ,exp var)))
+ . ,tl)
`(macroexp-let2 ,test ,var ,exp
(macroexp-let2* ,test ,tl ,@body)))))
next prev parent reply other threads:[~2022-04-11 17:26 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-04-11 16:26 [PATCH] Adding with-gensyms and once-only to subr-x Sean Whitton
2022-04-11 16:48 ` Stefan Monnier
2022-04-11 17:01 ` Sean Whitton
2022-04-11 17:26 ` Stefan Monnier [this message]
2022-04-11 18:41 ` Sean Whitton
2022-04-11 19:11 ` Stefan Monnier
2022-04-11 20:25 ` Sean Whitton
2022-04-11 21:11 ` Stefan Monnier
2022-04-11 23:05 ` Sean Whitton
2022-04-11 23:15 ` Sean Whitton
2022-04-12 0:06 ` Sean Whitton
2022-04-12 3:08 ` Stefan Monnier
2022-04-12 6:02 ` Sean Whitton
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=jwv5ynfy2fy.fsf-monnier+emacs@gnu.org \
--to=monnier@iro.umontreal.ca \
--cc=emacs-devel@gnu.org \
--cc=spwhitton@spwhitton.name \
/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.