unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#18821: 25.0.50; Let pp-macroexpand-expression expand only once
@ 2014-10-24 23:13 Michael Heerdegen
  2014-10-28 17:00 ` Stefan Monnier
  0 siblings, 1 reply; 6+ messages in thread
From: Michael Heerdegen @ 2014-10-24 23:13 UTC (permalink / raw)
  To: 18821


Hello,

this is a feature request.

The problem is the following:

When writing a complex macro, one often wants to check some examples to
see if it expands code as intended.

There are different ways of doing that: M-x pp-macroexpand-expression or
M-x emacs-lisp-macroexpand for example.

But there is a problem: if the macro expansion is a toplevel call to
some other macro, this one will also be expanded, because the above
commands use `macroexpand' which successively expands until the result
is not a macro call.  This is not useful for checking macro expansions.

I want to suggest to alter `pp-macroexpand-expression', or to provide a
new command, based on a function that expands only one time like

    (defun macroexpand1 (expr)
      (apply (cdr (symbol-function (car expr))) (cdr expr)))

(This can no doubt be improved, e.g. to DTRT for autoloaded macros.)


Or did I miss something?  Opinions?


Thanks,

Michael.





In GNU Emacs 25.0.50.1 (x86_64-unknown-linux-gnu, GTK+ Version 3.14.1)
 of 2014-10-17 on drachen
Windowing system distributor `The X.Org Foundation', version 11.0.11601000
System Description:	Debian GNU/Linux testing (jessie)






^ permalink raw reply	[flat|nested] 6+ messages in thread

* bug#18821: 25.0.50; Let pp-macroexpand-expression expand only once
  2014-10-24 23:13 bug#18821: 25.0.50; Let pp-macroexpand-expression expand only once Michael Heerdegen
@ 2014-10-28 17:00 ` Stefan Monnier
  2014-10-29  3:53   ` Michael Heerdegen
  0 siblings, 1 reply; 6+ messages in thread
From: Stefan Monnier @ 2014-10-28 17:00 UTC (permalink / raw)
  To: Michael Heerdegen; +Cc: 18821

>     (defun macroexpand1 (expr)
>       (apply (cdr (symbol-function (car expr))) (cdr expr)))

Daniel Colascione already submitted a patch that provides
a macroexpand1.  And if that's not sufficient I also wrote my own.
The only reason I haven't installed it is because it would make a lot of
sense to reimplement `macroexpand' (in Elisp) on top of `macroexpand1',
but when I tried that, byte-compilation slowed down by about 5%, which
seemed excessive (especially since it reflects an even larger slowdown
of macroexpansion itself, tho I haven't measured that in more detail).


        Stefan


(defun macroexp-expand-1 (form environment)
  "Perform (at most) one step of macroexpansion."
  (cond
   ((consp form)
    (let* ((head (car form))
           (env-expander (assq head environment)))
      (if env-expander
          (if (cdr env-expander)
              (apply (cdr env-expander) (cdr form))
            form)
        (if (not (and (symbolp head) (fboundp head)))
            form
          (let ((def (autoload-do-load (symbol-function head) head 'macro)))
            (cond
             ;; Follow alias, but only for macros, otherwise we may end up
             ;; skipping an important compiler-macro (e.g. cl--block-wrapper).
             ((and (symbolp def) (macrop def)) (cons def (cdr form)))
             ((not (consp def)) form)
             (t
              (if (eq 'macro (car def))
                  (apply (cdr def) (cdr form))
                form))))))))
   (t form)))





^ permalink raw reply	[flat|nested] 6+ messages in thread

* bug#18821: 25.0.50; Let pp-macroexpand-expression expand only once
  2014-10-28 17:00 ` Stefan Monnier
@ 2014-10-29  3:53   ` Michael Heerdegen
  2014-10-31 21:36     ` Stefan Monnier
  0 siblings, 1 reply; 6+ messages in thread
From: Michael Heerdegen @ 2014-10-29  3:53 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 18821

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

> Daniel Colascione already submitted a patch that provides a
> macroexpand1.  And if that's not sufficient I also wrote my own.  The
> only reason I haven't installed it is because it [...]

Ok, thanks for the info.  I think that this macroexpand1 should also be
made available via some command.

Michael.





^ permalink raw reply	[flat|nested] 6+ messages in thread

* bug#18821: 25.0.50; Let pp-macroexpand-expression expand only once
  2014-10-29  3:53   ` Michael Heerdegen
@ 2014-10-31 21:36     ` Stefan Monnier
  2014-11-02  4:07       ` Michael Heerdegen
  0 siblings, 1 reply; 6+ messages in thread
From: Stefan Monnier @ 2014-10-31 21:36 UTC (permalink / raw)
  To: Michael Heerdegen; +Cc: 18821

>> Daniel Colascione already submitted a patch that provides a
>> macroexpand1.  And if that's not sufficient I also wrote my own.  The
>> only reason I haven't installed it is because it [...]
> Ok, thanks for the info.  I think that this macroexpand1 should also be
> made available via some command.

I installed my macroexpand-1 into trunk.


        Stefan





^ permalink raw reply	[flat|nested] 6+ messages in thread

* bug#18821: 25.0.50; Let pp-macroexpand-expression expand only once
  2014-10-31 21:36     ` Stefan Monnier
@ 2014-11-02  4:07       ` Michael Heerdegen
  2014-11-02  5:46         ` Stefan Monnier
  0 siblings, 1 reply; 6+ messages in thread
From: Michael Heerdegen @ 2014-11-02  4:07 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 18821

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

> I installed my macroexpand-1 into trunk.

Thanks!

Do you think that `pp-macroexpand-expression' and
`pp-macroexpand-last-sexp' should use it?  I don't use these, but they
seem to be intended mainly for testing, where `macroexpand-1'
would makes more sense then `macroexpand'.

If you think the question is not important cause nobody uses the
pp-macroexpand stuff (dunno), feel free to close.


Thanks,

Michael.





^ permalink raw reply	[flat|nested] 6+ messages in thread

* bug#18821: 25.0.50; Let pp-macroexpand-expression expand only once
  2014-11-02  4:07       ` Michael Heerdegen
@ 2014-11-02  5:46         ` Stefan Monnier
  0 siblings, 0 replies; 6+ messages in thread
From: Stefan Monnier @ 2014-11-02  5:46 UTC (permalink / raw)
  To: Michael Heerdegen; +Cc: 18821-done

>> I installed my macroexpand-1 into trunk.
> Thanks!
> Do you think that `pp-macroexpand-expression' and
> `pp-macroexpand-last-sexp' should use it?

Oh, yes, of course.  Same for emacs-lisp-macroexpand.
Sorry for forgetting about the actual bug report.  It's done now,


        Stefan





^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2014-11-02  5:46 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-10-24 23:13 bug#18821: 25.0.50; Let pp-macroexpand-expression expand only once Michael Heerdegen
2014-10-28 17:00 ` Stefan Monnier
2014-10-29  3:53   ` Michael Heerdegen
2014-10-31 21:36     ` Stefan Monnier
2014-11-02  4:07       ` Michael Heerdegen
2014-11-02  5:46         ` Stefan Monnier

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).