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

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

Re: macros and macroexpand


From: Philip Kaludercic
Subject: Re: macros and macroexpand
Date: Tue, 08 Aug 2023 05:57:40 +0000

Heime <heimeborgia@protonmail.com> writes:

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

In that case, if I understand you correctly (a concrete example might be
useful), macroexpand-all is the right approach.

>> 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]