help-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: macros and macroexpand


From: Heime
Subject: Re: macros and macroexpand
Date: Mon, 07 Aug 2023 20:56:18 +0000

------- Original Message -------
On Tuesday, August 8th, 2023 at 8:08 AM, Philip Kaludercic <philipk@posteo.net> 
wrote:


> Heime heimeborgia@protonmail.com writes:
> 
> > Sent with Proton Mail secure email.
> > 
> > ------- Original Message -------
> > On Tuesday, August 8th, 2023 at 2:22 AM, Philip Kaludercic 
> > philipk@posteo.net wrote:
> > 
> > > Heime heimeborgia@protonmail.com writes:
> > > 
> > > > Sent with Proton Mail secure email.
> > > > 
> > > > ------- Original Message -------
> > > > On Monday, August 7th, 2023 at 11:46 PM, Yuri Khan 
> > > > yuri.v.khan@gmail.com wrote:
> > > > 
> > > > > On Mon, 7 Aug 2023 at 18:04, Heime heimeborgia@protonmail.com wrote:
> > > > > 

> > > > (defmacro adder (mopi mopj)
> > > > `(+ ,(cl-second mopi) ,(cl-third mopj)))
> > > > 
> > > > (princ (pp-to-string '(adder (* 3 5) (* 5 7)) ))
> > > 
> > > ^
> > > don't do this
> > > 
> > > If you quote an expression, it won't be evaluated or macro-expanded any
> > > further. You can sort-of think of a macro like a kind of inline
> > > function call. The evaluation would go along these lines:
> > > 
> > > (princ (pp-to-string (adder (* 3 5) (* 5 7))))
> > > 
> > > will be transformed into this at macro-expansion time, and evaluation
> > > would do this:
> > > 
> > > (princ (pp-to-string (+ (cl-second '(* 3 5)) (cl-third '(* 5 7)))))
> > > (princ (pp-to-string (+ 3 7)))
> > > (princ (pp-to-string 10))
> > > (princ "10\n")
> > > "10\n"
> > 
> > What I want to do is print the code made by adder of its final expansion 
> > code.
> > Rather than the last evaluation of 10, I want to print (+ 3 7).
> > 
> > Can my print command be modified in such a way that the message shows (+ 3 
> > 7) ?
> > IT seems that I would need to use macroexpand-all, to get to the final 
> > unevaluated
> > sexp.
> 
> 
> You can modify your macro, to return a quoted expression.
> 
> (defmacro adder (mopi mopj)
> `'(+ ,(cl-second mopi) ,(cl-third mopj)))
> ^
> note this

That means that you do not evaluate the sexp.  I see this more of a hack
to be able to print the sexp as elisp code, rather than the way a macro
will be coded for practical use.  Am I right ?

What I want to have is a function that is able to print the end sexp result
produced by a practically implemented macro, without evaluating the expression. 

> This is synonymous with
> 
> (defmacro adder (mopi mopj)
> (list 'quote (list '+ (cl-second mopi) (cl-third mopj))))
> 
> which makes sense, if you keep in mind that the result of evaluating the
> macro is what replaces the macro expression in the syntax tree.
> 
> > > > I would not do
> > > > 
> > > > (princ (pp-to-string (macroexpand '(adder (* 3 5) (* 5 7))) ))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]