From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: pjb@informatimago.com (Pascal J. Bourguignon) Newsgroups: gmane.emacs.help Subject: Re: Is it possible for a macro to expand to nothing? Date: Mon, 23 Nov 2009 19:42:42 +0100 Organization: Informatimago Message-ID: <87r5rpccbh.fsf@galatea.local> References: NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Trace: ger.gmane.org 1259005333 28222 80.91.229.12 (23 Nov 2009 19:42:13 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Mon, 23 Nov 2009 19:42:13 +0000 (UTC) To: help-gnu-emacs@gnu.org Original-X-From: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Mon Nov 23 20:42:06 2009 Return-path: Envelope-to: geh-help-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.50) id 1NCenR-000807-Cx for geh-help-gnu-emacs@m.gmane.org; Mon, 23 Nov 2009 20:42:01 +0100 Original-Received: from localhost ([127.0.0.1]:48503 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NCenQ-0002Dp-Kj for geh-help-gnu-emacs@m.gmane.org; Mon, 23 Nov 2009 14:42:00 -0500 Original-Path: news.stanford.edu!usenet.stanford.edu!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail Original-Newsgroups: gnu.emacs.help Original-Lines: 62 Original-X-Trace: individual.net c3CAt176efvTXNzQvw8EAQdaAlhV/LSvLxF9RjPQLj0efP241x Cancel-Lock: sha1:MzRmYzhhOTViNmRmZjFjODYyOTgzOGYxMTU2MWQ5OTY2ZTRhM2NjZg== sha1:FQDzFZnkZ9ez1LaDbdTQyzmwkjg= Face: iVBORw0KGgoAAAANSUhEUgAAADAAAAAwAQMAAABtzGvEAAAABlBMVEUAAAD///+l2Z/dAAAA oElEQVR4nK3OsRHCMAwF0O8YQufUNIQRGIAja9CxSA55AxZgFO4coMgYrEDDQZWPIlNAjwq9 033pbOBPtbXuB6PKNBn5gZkhGa86Z4x2wE67O+06WxGD/HCOGR0deY3f9Ijwwt7rNGNf6Oac l/GuZTF1wFGKiYYHKSFAkjIo1b6sCYS1sVmFhhhahKQssRjRT90ITWUk6vvK3RsPGs+M1RuR mV+hO/VvFAAAAABJRU5ErkJggg== X-Accept-Language: fr, es, en X-Disabled: X-No-Archive: no User-Agent: Gnus/5.1008 (Gnus v5.10.8) Emacs/22.3 (darwin) Original-Xref: news.stanford.edu gnu.emacs.help:174985 X-BeenThere: help-gnu-emacs@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Users list for the GNU Emacs text editor List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Errors-To: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.help:70057 Archived-At: "Drew Adams" writes: >> I think I want to be able to do this: >> >> (defun foo () >> (setq bar 1) >> (ifdef baz (setq bar 2))) >> >> , and if baz is nil at compile time, this function should be >> identical to >> >> (defun foo () >> (setq bar 1)) > > (defmacro titi (fn) > `(defun ,fn () > (setq bar 1) > ,@(ifdef baz '((setq bar 2)))))) > > Assuming that ifdef returns nil if baz is nil, that should give you (defun foo > () (setq bar 1)). If baz is not nil, it should give you this: > > (defun foo () > (setq bar 1) > (setq bar 2)) > > Or something like that. Yes. Unfortunately, (ifdef baz '((setq bar 2))) doesn't produce a valid form when baz is not nil. When it is used outside of a macro, that produces an error. This is not a good property. It would be better to keep the contract of macros, that is they take code, and they produce code, that is, valid forms. This can be done if you wrap the body in a progn when baz is not nil. (defmacro ifdef (expr &rest body) (if (eval expr) 'nil `(progn ,@body))) (require 'cl) ; as usual (defmacro titi (fn) `(defun ,fn () (setq bar 1) ,@(let ((form (macroexpand '(ifdef baz (setq bar 2))))) (and form `(,form))))) (dolist (baz '(nil t)) (print (macroexpand '(titi foo)))) (defun foo nil (setq bar 1) (progn (setq bar 2))) (defun foo nil (setq bar 1)) nil Notice that (defun foo nil (setq bar 1) (progn (setq bar 2))) and (defun foo nil (setq bar 1) (setq bar 2)) compile to exactly the same. -- __Pascal Bourguignon__