unofficial mirror of help-gnu-emacs@gnu.org
 help / color / mirror / Atom feed
* How to debug function that uses macros
@ 2017-02-26 18:20 Joe Riel
  2017-02-27  4:36 ` Stefan Monnier
  0 siblings, 1 reply; 4+ messages in thread
From: Joe Riel @ 2017-02-26 18:20 UTC (permalink / raw)
  To: Help GNU Emacs

How do I debug, using edebug, a function that uses macros?
I want to step through the macro expansion.

The obvious way to do this is to first create the fully 
expanded function, then use edebug on that.  Maybe there
is a better way, but that should work.  But how do I 
create the fully expanded function?   Neither macroexpand
nor macroexpand-all do anything useful here that I can tell.
For example

  (macroexpand-all '(my-function))

just displays (my-function).  

-- 
Joe Riel




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

* Re: How to debug function that uses macros
  2017-02-26 18:20 How to debug function that uses macros Joe Riel
@ 2017-02-27  4:36 ` Stefan Monnier
  2017-03-01  6:53   ` Joe Riel
  0 siblings, 1 reply; 4+ messages in thread
From: Stefan Monnier @ 2017-02-27  4:36 UTC (permalink / raw)
  To: help-gnu-emacs

> How do I debug, using edebug, a function that uses macros?
> I want to step through the macro expansion.

Depends where the expanded code comes from.

If it comes from the macro call itself, then you'll want to add a debug
declaration to the macro, to explain which parts of the macro's
arguments are expressions.  Something like

    (defmacro foo (bar baz)
      (declare (debug (symbolp form)))
      ...)

If the expanded code you want to step through comes from the macro
itself, then you can try to use edebug-` instead of the normal `, such
as:

    (defmacro foo (bar baz)
      (declare (debug (symbolp form)))
      (edebug-\` (let ((,bar (something))) ,baz)))

> The obvious way to do this is to first create the fully 
> expanded function, then use edebug on that.  Maybe there
> is a better way, but that should work.  But how do I 
> create the fully expanded function?   Neither macroexpand
> nor macroexpand-all do anything useful here that I can tell.
> For example
>
>   (macroexpand-all '(my-function))
>
> just displays (my-function).  

Only if `my-function` is a function, in which case indeed there's
nothing to expand.


        Stefan




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

* Re: How to debug function that uses macros
  2017-02-27  4:36 ` Stefan Monnier
@ 2017-03-01  6:53   ` Joe Riel
  2017-03-01 13:52     ` Stefan Monnier
  0 siblings, 1 reply; 4+ messages in thread
From: Joe Riel @ 2017-03-01  6:53 UTC (permalink / raw)
  To: help-gnu-emacs

On Sun, 26 Feb 2017 23:36:00 -0500
Stefan Monnier <monnier@iro.umontreal.ca> wrote:

> > How do I debug, using edebug, a function that uses macros?
> > I want to step through the macro expansion.
> 
> Depends where the expanded code comes from.
> 
> If it comes from the macro call itself, then you'll want to add a debug
> declaration to the macro, to explain which parts of the macro's
> arguments are expressions.  Something like
> 
>     (defmacro foo (bar baz)
>       (declare (debug (symbolp form)))
>       ...)
> 
> If the expanded code you want to step through comes from the macro
> itself, then you can try to use edebug-` instead of the normal `, such
> as:
> 
>     (defmacro foo (bar baz)
>       (declare (debug (symbolp form)))
>       (edebug-\` (let ((,bar (something))) ,baz)))

I couldn't get that to do anything.
Do I evaluate the macro (here foo) normally,
then instrument the function that calls it?
I tried doing that, but nothing changes when stepping 
through the function that includes the macro call.

> 
> > The obvious way to do this is to first create the fully 
> > expanded function, then use edebug on that.  Maybe there
> > is a better way, but that should work.  But how do I 
> > create the fully expanded function?   Neither macroexpand
> > nor macroexpand-all do anything useful here that I can tell.
> > For example
> >
> >   (macroexpand-all '(my-function))
> >
> > just displays (my-function).  
> 
> Only if `my-function` is a function, in which case indeed there's
> nothing to expand.
> 
> 
>         Stefan
> 
> 



-- 
Joe Riel




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

* Re: How to debug function that uses macros
  2017-03-01  6:53   ` Joe Riel
@ 2017-03-01 13:52     ` Stefan Monnier
  0 siblings, 0 replies; 4+ messages in thread
From: Stefan Monnier @ 2017-03-01 13:52 UTC (permalink / raw)
  To: help-gnu-emacs

>> (defmacro foo (bar baz)
>>   (declare (debug (symbolp form)))
>>   (edebug-\` (let ((,bar (something))) ,baz)))

> I couldn't get that to do anything.
> Do I evaluate the macro (here foo) normally,

No: you need to edebug-instrument the code where you want to single-step
(i.e. the places in the code where you want the cursor to stop when you
single step), so you want to use C-u C-M-x on that `foo` definition.

> then instrument the function that calls it?

Of course, you can also use C-x C-M-x on the code that invokes `foo` but
it will only single-step within that code, not within the definition of `foo`.


        Stefan




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

end of thread, other threads:[~2017-03-01 13:52 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-02-26 18:20 How to debug function that uses macros Joe Riel
2017-02-27  4:36 ` Stefan Monnier
2017-03-01  6:53   ` Joe Riel
2017-03-01 13:52     ` Stefan Monnier

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