From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Heime Newsgroups: gmane.emacs.help Subject: Re: macros and macroexpand Date: Mon, 07 Aug 2023 18:06:32 +0000 Message-ID: <2cUOv53USl65TgeJJfJlgDmgfzHuXV-aVXANzNsUzvHYoGAwJS2QxesnnSrbkuath2yoan9_Ws8P37dXBRVIFdGgTkFb5rZuG5WyxnqSXv0=@protonmail.com> References: <87wmy7rkxp.fsf@posteo.net> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="31148"; mail-complaints-to="usenet@ciao.gmane.io" Cc: Yuri Khan , Heime via Users list for the GNU Emacs text editor To: Philip Kaludercic Original-X-From: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane-mx.org@gnu.org Mon Aug 07 20:07:30 2023 Return-path: Envelope-to: geh-help-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1qT4de-0007wA-KW for geh-help-gnu-emacs@m.gmane-mx.org; Mon, 07 Aug 2023 20:07:30 +0200 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qT4cy-0002Bt-Oq; Mon, 07 Aug 2023 14:06:48 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qT4cw-0002BX-IH for help-gnu-emacs@gnu.org; Mon, 07 Aug 2023 14:06:46 -0400 Original-Received: from mail-4318.protonmail.ch ([185.70.43.18]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qT4cu-0008JF-HG for help-gnu-emacs@gnu.org; Mon, 07 Aug 2023 14:06:46 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=protonmail.com; s=protonmail3; t=1691431601; x=1691690801; bh=9HBI8NBO1IMk/VGQ10Axm6/q5PleYtQfybOSXGDeThs=; h=Date:To:From:Cc:Subject:Message-ID:In-Reply-To:References: Feedback-ID:From:To:Cc:Date:Subject:Reply-To:Feedback-ID: Message-ID:BIMI-Selector; b=O/upLfpPPe89PjZK44a5edRbFw8eQ5YmJlWK3tjJCCPbG0qzUCyOIPQB/kRXs7hxs +PWOoyfIwReeJojWAIgPvKl7ukZZNhm9iGcFE4AL/8H/w5pyW93qATtNB9gE9yauRp iec01TvZdsGMBv+pUW/D6NvRfZE5h4FdZlEsIAE+FDJPqaucTX5Y06jO/itIuazQ+X AeFEypT/f9vLBCkQLSyDXwtBe4QO0zogDv56oZdPNmfaF99SImlcQ1A/bK4JvOfZQp WWuhlPOhcC5pq+Sr6stFZtzx18UV9Y9jQLW7/noTZyMOd73cJxle3JYLFCsHh97KlU 23qmg7yJZXicA== In-Reply-To: <87wmy7rkxp.fsf@posteo.net> Feedback-ID: 57735886:user:proton Received-SPF: pass client-ip=185.70.43.18; envelope-from=heimeborgia@protonmail.com; helo=mail-4318.protonmail.ch X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: help-gnu-emacs@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Users list for the GNU Emacs text editor List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.help:144666 Archived-At: Sent with Proton Mail secure email. ------- Original Message ------- On Tuesday, August 8th, 2023 at 2:22 AM, Philip Kaludercic wrote: > Heime heimeborgia@protonmail.com writes: >=20 > > Sent with Proton Mail secure email. > >=20 > > ------- Original Message ------- > > On Monday, August 7th, 2023 at 11:46 PM, Yuri Khan yuri.v.khan@gmail.co= m wrote: > >=20 > > > On Mon, 7 Aug 2023 at 18:04, Heime heimeborgia@protonmail.com wrote: > > >=20 > > > > I have made a macro and know that they are supposed to return > > > > expanded code for use. Still I cannot understand the need to > > > > call "macroexpand". Should't the macro already perform the > > > > expansion ? > > >=20 > > > You should be posting small examples of code that you=E2=80=99re tryi= ng, > > > otherwise, there is high chance people will either misunderstand you > > > or just disregard your questions as ill-posed. > > >=20 > > > ---- > > >=20 > > > When you define a macro, you indeed write the definition similarly to > > > a function that returns expanded code. > > >=20 > > > (defmacro foo (&rest body) > > > `(bar ,@body)) When you evaluate a form that references a macro, Elis= p will (1) expand the macro, and (2) evaluate the result of the expansion: = (foo 'quux) =E2=87=92 Debugger entered--Lisp error: (void-function bar) On = the other hand, calling =E2=80=98macroexpand=E2=80=99 on a data representat= ion of that form will just return the expansion result: (macroexpand '(foo = 'quux)) =E2=87=92 (bar 'quux) In this example, I did not bother to define = =E2=80=98bar=E2=80=99, so Elisp assumes it would be a function and complain= s at evaluation time. But I could further define =E2=80=98bar=E2=80=99 as a= macro: (defmacro bar (&rest body)` (baz ,@body)) > > >=20 > > > In this case, evaluating the original form shows that Elisp expanded > > > both macros =E2=80=98foo=E2=80=99 and =E2=80=98bar=E2=80=99, and then= tried to call the undefined > > > function =E2=80=98baz=E2=80=99: > > >=20 > > > (foo 'quux) > > > =E2=87=92 Debugger entered--Lisp error: (void-function baz) > > >=20 > > > Meanwhile, =E2=80=98macroexpand=E2=80=99 still just expands a single = level of macros: > > >=20 > > > (macroexpand '(foo 'quux)) > > > =E2=87=92 (bar 'quux) > > >=20 > > > and you can invoke it repeatedly until you get to the fixed point: > > >=20 > > > (macroexpand (macroexpand '(foo 'quux))) > > > =E2=87=92 (baz 'quux) > > >=20 > > > (macroexpand (macroexpand (macroexpand '(foo 'quux)))) > > > =E2=87=92 (baz 'quux) > >=20 > > Then macroexpand is useful for diagnostics to expand at one level only > > at a time. Thusly, if I just want to get the expanded code produced by > > a macro, I can just do pp-to-string upon the object made by a macro. > >=20 > > (defmacro adder (mopi mopj) > > `(+ ,(cl-second mopi) ,(cl-third mopj))) > >=20 > > (princ (pp-to-string '(adder (* 3 5) (* 5 7)) )) >=20 > ^ > don't do this >=20 > 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: >=20 > (princ (pp-to-string (adder (* 3 5) (* 5 7)))) >=20 > will be transformed into this at macro-expansion time, and evaluation > would do this: >=20 > (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 co= de. Rather than the last evaluation of 10, I want to print (+ 3 7). =20 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 unev= aluated sexp.=20 =20 > > I would not do > >=20 > > (princ (pp-to-string (macroexpand '(adder (* 3 5) (* 5 7))) ))