all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
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)))))
 




  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.