From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.ciao.gmane.io!not-for-mail From: Michael Heerdegen Newsgroups: gmane.emacs.help Subject: Re: Compiling a recursive macro Date: Thu, 11 Jun 2020 23:27:21 +0200 Message-ID: <87r1ul47k6.fsf@web.de> References: <22b55d6d-f719-98d9-f8c8-e72e7fc43497@gmail.com> Mime-Version: 1.0 Content-Type: text/plain Injection-Info: ciao.gmane.io; posting-host="ciao.gmane.io:159.69.161.202"; logging-data="3937"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.0.50 (gnu/linux) To: help-gnu-emacs@gnu.org Cancel-Lock: sha1:j2zqj5T+hGGaTfSARi4y0Mcpf9k= Original-X-From: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane-mx.org@gnu.org Thu Jun 11 23:29:17 2020 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 1jjUlA-0000vS-Rf for geh-help-gnu-emacs@m.gmane-mx.org; Thu, 11 Jun 2020 23:29:16 +0200 Original-Received: from localhost ([::1]:56418 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jjUl8-0006zV-Rp for geh-help-gnu-emacs@m.gmane-mx.org; Thu, 11 Jun 2020 17:29:15 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:53042) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jjUjS-0006xb-VG for help-gnu-emacs@gnu.org; Thu, 11 Jun 2020 17:27:30 -0400 Original-Received: from ciao.gmane.io ([159.69.161.202]:56542) by eggs.gnu.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jjUjQ-00078j-Jw for help-gnu-emacs@gnu.org; Thu, 11 Jun 2020 17:27:29 -0400 Original-Received: from list by ciao.gmane.io with local (Exim 4.92) (envelope-from ) id 1jjUjP-000Wnq-PE for help-gnu-emacs@gnu.org; Thu, 11 Jun 2020 23:27:27 +0200 X-Injected-Via-Gmane: http://gmane.org/ Received-SPF: pass client-ip=159.69.161.202; envelope-from=geh-help-gnu-emacs@m.gmane-mx.org; helo=ciao.gmane.io X-detected-operating-system: by eggs.gnu.org: First seen = 2020/06/11 16:57:12 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: 1 X-Spam_score: 0.1 X-Spam_bar: / X-Spam_report: (0.1 / 5.0 requ) BAYES_00=-1.9, FREEMAIL_FORGED_FROMDOMAIN=1, FREEMAIL_FROM=0.001, HEADER_FROM_DIFFERENT_DOMAINS=1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=_AUTOLEARN X-Spam_action: no action X-BeenThere: help-gnu-emacs@gnu.org X-Mailman-Version: 2.1.23 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" Xref: news.gmane.io gmane.emacs.help:123338 Archived-At: Stefan Monnier writes: > > That suggests to me that you can't compile any recursive macro. > > Depends what you mean by "recursive macro". > What this prevents is to use a macro inside the definition of a macro. Which means: the macro is not allowed to be used to generate the expansion. But it may appear in the expansion. > Most cases of "recursive macros" instead just returns code which > itself uses that macro. > [...] > This works just fine (and may inf-loop, of course). That's indeed the most common problem in this area I think. @Douglas: Often it helps me to remember the macro expander as a normal function. You can literally rewrite a macro definition (defmacro my-macro (args...) body...) using one function call as macro body instead: (defmacro my-macro (args...) (my-macro-expander args...)) with (defun my-macro-expander (args...) body...) where body... is the same as above in the defmacro. Keeping that in mind, the answer to your question is more obvious, and practically you can use the above transformation to trace or edebug `my-macro-expander' to see what happens when the macro is actually expanded somewhere. Michael.