[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))) ))
- macros and macroexpand, Heime, 2023/08/07
- Re: macros and macroexpand, Yuri Khan, 2023/08/07
- Re: macros and macroexpand, Heime, 2023/08/07
- Re: macros and macroexpand, Philip Kaludercic, 2023/08/07
- Re: macros and macroexpand, Heime, 2023/08/07
- Re: macros and macroexpand, Philip Kaludercic, 2023/08/07
- Re: macros and macroexpand, Heime, 2023/08/07
- Re: macros and macroexpand,
Philip Kaludercic <=
- Re: macros and macroexpand, Emanuel Berg, 2023/08/08
- Re: macros and macroexpand, Heime, 2023/08/08
RE: [External] : macros and macroexpand, Drew Adams, 2023/08/07
Re: macros and macroexpand, Emanuel Berg, 2023/08/08