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 12:43:13 +0000 Message-ID: References: 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="39922"; mail-complaints-to="usenet@ciao.gmane.io" Cc: Heime via Users list for the GNU Emacs text editor To: Yuri Khan Original-X-From: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane-mx.org@gnu.org Mon Aug 07 14:43:59 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 1qSzaY-000A8p-K1 for geh-help-gnu-emacs@m.gmane-mx.org; Mon, 07 Aug 2023 14:43:58 +0200 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qSzZz-0002WG-QY; Mon, 07 Aug 2023 08:43:23 -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 1qSzZy-0002W8-8l for help-gnu-emacs@gnu.org; Mon, 07 Aug 2023 08:43:22 -0400 Original-Received: from mail-4319.protonmail.ch ([185.70.43.19]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qSzZw-0001qr-92 for help-gnu-emacs@gnu.org; Mon, 07 Aug 2023 08:43:22 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=protonmail.com; s=protonmail3; t=1691412197; x=1691671397; bh=+n83rGMe9MDp+4Z431iVD2460mP7NzG+Opo3YgK19Mo=; 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=OBapwHBaMQw0i7SqjUdId/wQivBxf1adLoJfVa6gjpIELoz3Q+6soyBADa4W1kBG3 Sgi/jKJvH6FOGIleFx+ekiaNZyhimNPgXwHz3ppmRKfb9JwDlxQ0G0/HoomRcAhVf+ BZQ/knh7qkqMETcFlmYAv3vx7aLwDFdnQHbsTyzTM43ioRwQ82Vy4dtDSBaaHq4vs3 j1uDGq0zeLtkhm3GFd9gDfo3nMRPfaeIOu1jJg+blmxOAFWbrQHYWMm/GBtQAOofLf VZ0jOuiO5s51GIuhGvqWvCs+ecAcsYTQqg7xJt5kgrIOBBYoAJZnPc0wn7xkkDC+kg /ngmfoB+jkPgQ== In-Reply-To: Feedback-ID: 57735886:user:proton Received-SPF: pass client-ip=185.70.43.19; envelope-from=heimeborgia@protonmail.com; helo=mail-4319.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, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=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:144663 Archived-At: Sent with Proton Mail secure email. ------- Original Message ------- On Monday, August 7th, 2023 at 11:46 PM, Yuri Khan = wrote: > 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 >=20 > You should be posting small examples of code that you=E2=80=99re trying, > 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, Elisp wi= ll (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 representation = of that form will just return the expansion result: (macroexpand '(foo 'quu= x)) =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 tri= ed 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 leve= l 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) 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=20 a macro, I can just do pp-to-string upon the object made by a macro. (defmacro adder (mopi mopj) `(+ ,(cl-second mopi) ,(cl-third mopj))) (princ (pp-to-string '(adder (* 3 5) (* 5 7)) )) I would not do (princ (pp-to-string (macroexpand '(adder (* 3 5) (* 5 7))) ))